为什么在OnCreate()中设置ViewTreeObserver> OnScrollChangedListener不会在Android 2.x上调用?

我发现Android 2.x上的OnScrollChangedListener在第一次布局绘制之前就不会被解雇。 例如,当您在onCreate / onResume / onAttachedToWindow方法中添加滚动侦听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 } } }); 

有关OnScrollChangedListener (Rus; Kotlin)的详细信息,