看标题是不是不太明白,来两张图片:
正常情况下,我们期待的是进入页面以后显示左图效果,可是由于NestedScrollView
嵌套RecyclerView
,导致Recyclerview
占据焦点导致整个NestedScrollView
内容上滑。知道原因以后解决这个 bug 就容易多了。
当在Fragment
使用NestedScrollView
嵌套RecyclerView
时,来回切换Fragment
时会发现NestedScrollView
会自动向上滚动一段距离;
我第一反应就是有布局抢焦点了,有时候如果有EditText也会有类似的现象,解决办法就是在NestedScrollView里的唯一布局设置自动获取焦点,代码如下:
方法一:
在根布局设置android:descendantFocusability=”blocksDescendants” ;
android:descendantFocusability 有三种值:
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点
方法二:
对于有Editext的页面需要在根布局使用 :
android:focusable="true"
android:focusableInTouchMode="true"
方法三:
在NestedScrollView顶部第一个控件使用 :
android:focusable="true"
android:focusableInTouchMode="true"
这种方法我觉得有点不太可靠,因为有时候是可行的,有时候是不行的。。。。
代码示例:
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#EEEEEE">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"//关键
android:focusableInTouchMode="true"//关键
android:orientation="vertical">
</LinearLayout>
</androidx.core.widget.NestedScrollView>