为什么在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)的详细信息,