ScrollView嵌套RecyclerView:进入界面ScrollView自动滑动

背景:ScrollView嵌套PreferenceFragment。我使用的版本Preference的树的支撑是通过RecyclerView。

 

原因:在Activity的setContentView方法中,解析了Fragment,并调用了PreferenceFragmentCompat的onCreateView方法,方法后面post了一个Runnable。

ScrollView嵌套RecyclerView:进入界面ScrollView自动滑动

ScrollView嵌套RecyclerView:进入界面ScrollView自动滑动

通过调用父View的focusableViewAvailable方法后,会进入ViewRootImpl

ScrollView嵌套RecyclerView:进入界面ScrollView自动滑动

    可以看见如果当前以mView为根节点的树没有focusedView时,那么当前的View v就会去申请Focus。v就是RecyclerView,可气的是他的配置信息还允许他获取Focus。

    在requestFocus中ScrollView重写了requestChildFocus方法。

ScrollView嵌套RecyclerView:进入界面ScrollView自动滑动

看见没有,罪魁祸首出现了mChildToScrollTo。   接下来我们来看看ScrollView的onLayout方法。

ScrollView嵌套RecyclerView:进入界面ScrollView自动滑动

你没看错ScrollView居然在onLayout的时候悄悄的Scroll了自己,可耻啊。scrollToDescendant看方法名就知道他干的好事了,我们就不去展开了。

解决方法:

1.找一个Scroll合适的子View。

2.适配其可以获取Focus。(focusableInTouchMode && focusable)

3.view主动获取Focus(requestFocus())