我发现Android 2.x上的OnScrollChangedListener如果在第一次布局绘制之前添加它,就不会被触发.例如,在onCreate / onResume / onAttachedToWindow等方法中添加滚动侦听器时:
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)
最佳答案
所以,这似乎是一个错误.这是一个简单的解决方法:
要使OnScrollChangedListener在旧设备上工作(显然API< = 15),您应该在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; Kotlin)