OnScrollChangedListener

OnScrollChangedListener

我发现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
            }
        });
    }
}

有人知道这个问题的原因吗?
提示:似乎这个问题有时会在api

最佳答案

所以,看起来像只虫子。下面是一个简单的解决方法:
要使OnScrollChangedListener在旧设备上工作(显然是apionWindowFocusChanged(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)

07-27 16:54