我在两个文字视图的父视图上使用viewTreeObserver.addOnGlobalLayoutListener
,onGlobalLayout
,以便获得一个宽度和另一个的高度
private int row_height;
private int column_width;
private RelativeLayout RL;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RL = (RelativeLayout) findViewById(R.id.RL);
final TextView textView = (TextView) findViewById(R.id.textView33);
final TextView textView2 = (TextView) findViewById(R.id.textView25);
ViewTreeObserver viewTreeObserver = RL.getViewTreeObserver();
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
column_width = textView2.getWidth();
row_height = textView.getHeight();
textView.setText("column_width" + column_width + "\nrow_height" + row_height);
CreateEvent(0, 6, 4);
CreateEvent(0, 8, 6);
CreateEvent(0, 7, 7);
CreateEvent(0, 5, 2);
}
});
//CreateEvent(0,6,4); //not working
}
问题是CreateEvent
被无限次调用,这会减慢我的应用程序,所以如何解决这个问题?
我想要做的是在完全显示布局时,我保存textView25
的宽度和textView33
的高度以在CreateEvent
中使用它们,并且只有在布局更改时它们才会更改从portrait
到landscape
答案 0 :(得分:0)
我遇到了同样的问题。正如另一个回答者所建议的那样,我试图直接从ViewTreeObserver对象中删除OnGlobalLayoutListener,但是它给出了一个错误。最后,我从视图中抓取了树观察器,并从其中移除了OnGlobalLayoutListener,如下所示:
private class GLListener implements ViewTreeObserver.OnGlobalLayoutListener
{
@Override
public void onGlobalLayout()
{
adView.getViewTreeObserver().removeOnGlobalLayoutListener(glListener); //or "this"
/*
*CODE HERE RUNS ONCE
*/
}
}
GLListener是我实例化的类,并作为OnGlobalLayoutListener对象添加到adView(您可能已经猜到了),它是一个AdView。我这样做是为了避免嵌套类。您可以将其设为匿名。无论哪种方式,使用“ this”都可以代替对象引用,就像我一样。
答案 1 :(得分:-1)
收到回叫后立即删除侦听器 -
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
//Add this line
viewTreeObserver.removeOnGlobalLayoutListener(this);
column_width = textView2.getWidth();
row_height = textView.getHeight();
textView.setText("column_width" + column_width + "\nrow_height" + row_height);
CreateEvent(0, 6, 4);
CreateEvent(0, 8, 6);
CreateEvent(0, 7, 7);
CreateEvent(0, 5, 2);
}
});