1、在 onCreate() 方法中直接调用 view.getHeight() 会返回 0,但是可以在 view.post() 中获取控件的宽高:
view.post(new Runnable() {
@Override
public void run() {
showToast("" + view.getHeight());
}
});
2、用 View.postDelayed() 方法来防止一段时间内多次点击 view 而频繁触发点击事件:
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
view.setEnabled(false);
//进行其他操作
view.postDelayed(new Runnable() {
@Override
public void run() {
view.setEnabled(true);
}
}, 500);//500ms内只能点击一次
}
});
PS:post 带一个 Runnable,表示 Runnable 的工作在 UI 线程执行,可直接在 Runnable 内对UI进行更新操作,但要注意这里的 Runnable 不是新开了线程,因此不要进行复杂耗时的工作,以免阻塞导致 ANR。
3、从其它线程访问主线程主要有以下几种方式:
- Activity.runOnUiThread(Runnable)
- View.post(Runnable)
- View.postDelayed(Runnable, long)
- Handler
View.post 背后的运行过程可以参考下面的资料:
一种DelayLoad的实现和原理(下篇)
看完这篇分析,你就会明白为什么在 onCreate() 中要调用 View.post() 才可以获取一个 View 的高度。