为什么在OnCreate()中设置ViewTreeObserver> OnScrollChangedListener时未在Android 2.x上调用?
问题描述:
我发现Android 2.x上的OnScrollChangedListener
在第一次布局绘制之前就不会被解雇。例如,当您添加的方法滚动听众喜欢onCreate
/onResume
/onAttachedToWindow
:为什么在OnCreate()中设置ViewTreeObserver> OnScrollChangedListener时未在Android 2.x上调用?
public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View myView = findViewById(R.id.MyView);
System.out.println(myView.getViewTreeObserver().isAlive()); // true
myView.getViewTreeObserver().addOnScrollChangedListener(new OnScrollChangedListener() {
@Override
public void onScrollChanged() {
// will never fire
}
});
}
}
因此,任何人知道这个问题的原因是什么?
PS:好像这个问题上的API < = 15(的Android 4.0.3)的某个时候发生
答
所以,这似乎是一个错误。这里是一个简单的解决方法:
为了使旧设备(显然API < = 15)OnScrollChangedListener
工作,你应该增加它无论是在onWindowFocusChanged(true)
,或布局后测量(使用GlobalLayoutListener
)。
并且不要忘记创建一个像isScrollListenerAdded
这样的标志以避免重复的监听器连接。
事情是这样的:
myView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (!isScrollListenerAdded) {
isScrollListenerAdded = true;
// add OnScrollChangedListener here
}
}
});
详细情况见本blog post about OnScrollChangedListener可用(RUS;科特林)
非常感谢您更新的问题。我宁愿回答自己的问题,然后接受它。它会增加可读性。 – Pradeep
@Pradeep,完成!谢谢 –