add global layout listener即使没有附加侦听器,也会被调用,在这种情况下,它会进入一个循环,如何在不触发循环中的global layout listener的情况下编辑属性?谢谢您

final View getDecorView = activity.getWindow().getDecorView();
            getDecorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {

                    if (Build.VERSION.SDK_INT > 16) {
                        getDecorView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    } else {
                        getDecorView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    }

                    final TextView textView3 = (TextView) decorView.findViewById(2131558456);
                    if (textView3 != null) {
                                textView3.setText("updated");                      textView3.setBackgroundColor(Color.parseColor("#444444"));
                    }

                    getDecorView.getViewTreeObserver().addOnGlobalLayoutListener(this);

                }
            });

最佳答案

这样可以解决你的问题:

final View decorView = activity.getWindow().getDecorView();
final TextView textView3 = (TextView) decorView.findViewById(2131558456);
decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {

        if (Build.VERSION.SDK_INT > 16) {
            decorView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        } else {
            decorView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        }


        if (textView3 != null && !textView3.getText().equals("updated")) {
            textView3.setText("updated");
            textView3.setBackgroundColor(Color.parseColor("#444444"));
        }

        decorView.getViewTreeObserver().addOnGlobalLayoutListener(this);

    }
});

我假设textview3最初没有等同于“updated”的文本,所以当您将它的文本设置为“updated”时,它将充当一种标志,以便以后不再设置它。您还可以执行以下操作,其中imho更干净一些,因为您有一个实际的布尔标志,表示是否应该更新TextView
final View decorView = activity.getWindow().getDecorView();
final TextView textView3 = (TextView) decorView.findViewById(2131558456);
decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

    boolean updateTextview = true;

    @Override
    public void onGlobalLayout() {

        if (Build.VERSION.SDK_INT > 16) {
            decorView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        } else {
            decorView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        }


        if (textView3 != null && updateTextview) {
            updateTextview = false;
            textView3.setText("updated");
            textView3.setBackgroundColor(Color.parseColor("#444444"));
        }

        decorView.getViewTreeObserver().addOnGlobalLayoutListener(this);

    }
});

这两种解决方案都应该有效,因为它们停止了textview3的持续更新,这将导致另一个布局过程导致textview3的更新,这将导致另一个布局过程导致…继续。

08-27 08:58