为什么在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)的某个时候发生

+0

非常感谢您更新的问题。我宁愿回答自己的问题,然后接受它。它会增加可读性。 – Pradeep

+0

@Pradeep,完成!谢谢 –

所以,这似乎是一个错误。这里是一个简单的解决方法:

为了使旧设备(显然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;科特林)