布局使用ScrollView+RecycleView自动获取焦点问题解决

最近遇到一个问题是布局使用了ScrollView+RecycleView,RecycleView中放了EditText,当进入页面的时候,

会自动定位到RecycleView的位置,需要手动向上滑动才能滚动到顶部,原因是RecycleView中的EditText自动获取到了焦点。

一开始的解决方案是直接在ScrollView包裹的第一个ViewGroup加上android:descendantFocusability="blocksDescendants"属性,该属性的作用是覆盖子类控件而直接获得焦点,android:descendantFocusability还有另外两个属性值beforeDescendants:viewgroup会优先其子类控件而获取到焦点afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点。

当使用上android:descendantFocusability="blocksDescendants"后,的确解决了自动滚动到RecycleView位置的问题,但是会出现RecycleView中的EditText点击无效的现象,究其原因是ViewGroup禁止了子控件获取焦点的原因,所以EditText获取不到了焦点。

    新的解决方案是ViewGroup仍然加上android:descendantFocusability="blocksDescendants",给EditText加上触摸监听:

mEditText.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
         //通知ViewGroup修改android:descendantFocusability属性值
        EventBus.getDefault().post(new EditTextTouchEvent());
        return false;
    }
});

上述代码的作用是当触摸到EditText时,在onTouch中通知ViewGroup修改android:descendantFocusability属性值,并返回false,不消耗触摸事件,触摸事件就能一直往下传,EditText就能收到点击事件。当页面收到EditTextTouchEvent事件时再动态修改ViewGroup的descendantFocusability的值,这样EditText就能获取焦点了,也就能点击有效了,如下:

@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageEvent(EditTextTouchEvent event) {
    mViewGroup.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS);
}

 

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,针对你的问题,我可以提供一些思路和参考代码。 首先,实现 Android 中的自定义吸顶,可以采用两种方式: 1. 使用固定顶部控件 + ScrollView + ViewPager 的方式实现。 这种方式比较常见,具体实现思路如下: (1)在布局文件中定义一个固定在顶部的控件,例如 LinearLayout,将其设置为可见性为 gone,即不可见。 (2)在 ScrollView 中添加 ViewPager,将其填充满整个布局,用于滑动切换不同的子页面。 (3)监听 ScrollView 的滑动事件,在滑动到一定位置时,将顶部控件设置为可见,实现吸顶效果。 具体实现代码可以参考以下链接: - https://www.jianshu.com/p/4f28a4d0c3b1 - https://www.cnblogs.com/xiaohuafice/p/11050662.html 2. 使用 CoordinatorLayout + AppBarLayout 实现。 这种方式相对来说比较简单,具体实现思路如下: (1)在布局文件中使用 CoordinatorLayout 作为根布局,并添加一个 AppBarLayout 作为子布局。 (2)在 AppBarLayout 中添加一个 Toolbar 控件作为顶部的固定控件,将其设置为可见性为 gone。 (3)在子页面中,使用 NestedScrollView 作为滑动的容器,并将其放在 AppBarLayout 的下面。 (4)监听 NestedScrollView 的滑动事件,在滑动到一定位置时,将 Toolbar 设置为可见,实现吸顶效果。 具体实现代码可以参考以下链接: - https://www.jianshu.com/p/5d0f7e7e7c97 - https://www.jianshu.com/p/5d0f7e7e7c97 希望以上内容能够帮助到你,有什么问题可以再和我交流哦!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值