我有一个后台线程,在onCreate()
之后更新我的活动的UI。它可以添加布局,也可以更改其他布局。
我只想检测布景传递何时在我的活动中完成,以便能够手动更新其他视图的位置,这些视图直接取决于仅添加或修改的布局。
目前,我只是使用Handler
postDelayed runnable
来完成工作,经过一小段延迟后,在触发requestLayout()
的修改后大约50-100毫秒。
它有效,但我们显然可以看到延迟。我想尽快完成这项工作。在视图代码中,检测测量过程很简单,但我没有找到如何在活动中直接解决这个问题。
答案 0 :(得分:44)
GlobalLayoutListener将在完成布局时触发事件。这会满足你的需求吗?
View myView=findViewById(R.id.myView);
myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//At this point the layout is complete and the
//dimensions of myView and any child views are known.
}
});
答案 1 :(得分:2)
除了Phillip Fitzsimmons接受的答案,这是正确的,我还要注意,如果有人需要知道视图本身的大小,方法:
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
// your code here
}
可以覆盖,并在布局传递后调用它。
答案 2 :(得分:0)
您可以使用ViewTreeObserver.OnPreDrawListener
根据https://developer.android.com/reference/android/view/ViewTreeObserver.OnPreDrawListener上的文档
这时,树中的所有视图都已测量并给出了框架。
仅当树中的视图请求另一遍布局时,任何布局边界才会更改。您还可以使用类似的技术,通过ViewTreeObserver.OnDrawListener
来获取回调信息
myView.getViewTreeObserver().addOnPreDrawListener(
new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {
myView.getViewTreeObserver().removeOnPreDrawListener(this);
// view is measured and laid out
});