ScrollView嵌套RecyclerView:进入界面ScrollView自动滑动
背景:ScrollView嵌套PreferenceFragment。我使用的版本Preference的树的支撑是通过RecyclerView。
原因:在Activity的setContentView方法中,解析了Fragment,并调用了PreferenceFragmentCompat的onCreateView方法,方法后面post了一个Runnable。
通过调用父View的focusableViewAvailable方法后,会进入ViewRootImpl
可以看见如果当前以mView为根节点的树没有focusedView时,那么当前的View v就会去申请Focus。v就是RecyclerView,可气的是他的配置信息还允许他获取Focus。
在requestFocus中ScrollView重写了requestChildFocus方法。
看见没有,罪魁祸首出现了mChildToScrollTo。 接下来我们来看看ScrollView的onLayout方法。
你没看错ScrollView居然在onLayout的时候悄悄的Scroll了自己,可耻啊。scrollToDescendant看方法名就知道他干的好事了,我们就不去展开了。
解决方法:
1.找一个Scroll合适的子View。
2.适配其可以获取Focus。(focusableInTouchMode && focusable)
3.view主动获取Focus(requestFocus())