Mik*_*ike 5 android android-layout
即使没有附加侦听器,也会调用添加全局布局侦听器,在这种情况下它会进入循环,如何编辑属性而不在循环中触发全局布局侦听器?谢谢
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);
}
});
Run Code Online (Sandbox Code Playgroud)
这种类型可以解决您的问题:
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);
}
});
Run Code Online (Sandbox Code Playgroud)
我假设textview3
最初没有等于“已更新”的文本,因此当您将其文本设置为“已更新”时,它充当一种标志,以便您将来不会再次设置它。您还可以执行以下操作,恕我直言更简洁一些,因为您有一个实际的布尔标志,表示您是否应该更新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);
}
});
Run Code Online (Sandbox Code Playgroud)
两种解决方案都应该有效,因为它们会停止 的不断更新textview3
,这会导致另一个布局传递,导致更新textview3
导致另一个布局传递,从而导致......
归档时间: |
|
查看次数: |
6666 次 |
最近记录: |