viewTreeObserver.addOnGlobalLayoutListener,onGlobalLayout,infinte loop

时间:2016-03-03 11:14:51

标签: android

我在两个文字视图的父视图上使用viewTreeObserver.addOnGlobalLayoutListeneronGlobalLayout,以便获得一个宽度和另一个的高度

 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中使用它们,并且只有在布局更改时它们才会更改从portraitlandscape

2 个答案:

答案 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);
    }
});