首页 > 其他分享 >RecyclerView设置默认焦点跟多页面焦点抢占

RecyclerView设置默认焦点跟多页面焦点抢占

时间:2024-06-18 15:09:50浏览次数:21  
标签:抢占 hasFocus 焦点 默认 tab RecyclerView 页面

场景:多个tab切换,显示不同的Fragment,其中一个Fragment布局是两个RecyclerView,分别位于左右两侧

需求:首次从tabView切换到改tab页时,焦点从tabView首次往下移动时,需要落焦在右侧的第一个item上面

如果按照系统原生逻辑,从tabView下移,可能默认位置不会在右侧,此时需要确保,每次往下移动,焦点都需要在右侧第一个

方案1、初始化时就 requestFocus 肯定行不通,因为切换tab时就会触发

方案2、使用自定义View,重写 addFocusables ,把默认焦点添加进列表,此时系统默认寻找的焦点就是设置的view

方案可行,前提是没有焦点抢占问题(比如多tab同时存在时会有焦点抢占问题)

比如有个切换动效,动效存在时切换的两个页面会同时存在并且显示在前台,这个时候,快速切换tab并且往下移动,会发现动画未结束,落焦会跑到上一个tabView的页面上,然后动画结束,上一个页面隐藏,焦点在回到当前唯一显示的页面,虽然最后焦点回到了当前页面,可是会有一个焦点延迟闪烁的过程;

又或者你在其它地方主动 request 了,导致焦点冲突闪烁问题;

方案3、强行 requestFocus ,行为粗暴,并且有的情况下会多次请求,导致焦点闪烁问题

终极方案、使用父容器控制子容器焦点,哪怕焦点被抢占,依然可以丝滑落焦

不要一下子请求子View的焦点,把焦点定在最外层的父容器上面,系统默认移动是寻找最近的view作为落焦点,父容器无疑是最近的

监听父容器的焦点变化,如果存在焦点,在请求子View焦点(父容器上落焦状态需要隐藏,达到无痕状态)

这个时候你会发现,无论焦点是被其它view抢占,还是其它窗口抢占,都能回到你指定的view上

mBinding.rootView.setOnFocusChangeListener { v, hasFocus ->
            val focusItemView = mBinding.rvMode.getChildAt(0)
            Logger.d("FocusChange hasFocus $hasFocus itemFocus ${focusItemView.hasFocus()}")
            if (hasFocus && !focusItemView.hasFocus()) {
                mBinding.rvMode.post {
                    focusItemView?.requestFocus()
                }
            }
        }

 

标签:抢占,hasFocus,焦点,默认,tab,RecyclerView,页面
From: https://www.cnblogs.com/LiuZhen/p/18254410

相关文章

  • linux内存管理(十)- 页面回收(二)
    本篇了解一下内核是怎样触发页面回收的。触发内存回收的方式有两种,同步和异步回收。alloc_pages在分配内存的时候,如果内存短缺会主动回收内存,这是同步回收;内核有一个或多个kswapd内核线程负责在后台回收内存,这是异步。 看一下shrink_active_liststaticvoidshrink_lruvec(st......
  • Dcat admin laravel 快速安装及生成相应页面(新手)
    使用工具:phpEnv,phpStorm操作步骤:安装阿里云Composer镜像:打开命令行工具,如CMD或PowerShell。切换到自己安装phpEnv的www目录下我的是D:\Studysoft\phpEnv\www 。执行以下命令以设置全局Composer镜像:composerconfig-grepo.packagistcomposerhttps://mirror......
  • 鸿蒙期末大作业——甜点店铺APP(二)跳转页面的改进
    一、跳转页面的继续改进        上一期我们实现了登录页面的渲染,这一期我们进行登录完成后跳转页面的进一步加工。        当页面信息较多时,为了让用户能够聚焦于当前显示的内容,需要对页面内容进行分类,提高页面空间利用率。利用Tabs导航组件可以在一个页面内......
  • 轻松实现H5页面下拉刷新:滑动触发、高度提示与数据刷新全攻略
    前段时间在做小程序到H5的迁移,其中小程序中下拉刷新的功能引起了产品的注意。他说到,哎,我们迁移后的H5页面怎么没有下拉刷新,于是乎,我就急忙将这部分的内容给填上。本来是计划使用成熟的组件库来实现,尝试之后发现这些组件和我们H5页面的其他逻辑有冲突(H5还有吸顶、锚点、滑动高亮、......
  • HTML静态网页成品作业(HTML+CSS)—— 明星吴磊介绍网页(5个页面)
    ......
  • Chromium源码阅读:从页面加载到元素展示(1)
    ​从<p>helloworld</p>.html到界面上的helloworld今天,我们一起来看看一个html元素,是如何绘制到界面上。我们选择了最简单的场景,便于快速掌握总体的流程,加深之前阅读知识的印象。准备环境首先,我们保存这段html:<html><body><p>Helloworld</p></body><......
  • CSS动画(登录页面)
    1.整体效果https://mmbiz.qpic.cn/sz_mmbiz_gif/EGZdlrTDJa6Pfop3IiakrZOtiaiaKniaxeH2Gs407DmkXPsMo8AFKdsYibYcpZiboc24Ulic2CicmyvHmnwCrib7MDe6Jvg/640?wx_fmt=gif&from=appmsg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=12.完整代码HTML<!DOCTYPEhtml>......
  • C# Winform 设置焦点控件的两种方式和注意事项
    一、方法//设置本窗体的活动控件为某个控件this.ActiveControl=this.button2;//调用Focus方法设置某个控件获取焦点this.button2.Focus();二、注意事项1、在窗体实例化——加载——绘制——显示完毕四个过程中使用两种方法设置效果有区别,具体如下:namespaceWindowsFormsAppl......
  • 解决浏览器缩放的时候,重新设置滚动条的位置,使页面滚动条固定悬浮在页面底部
    项目场景:浏览器调试页面兼容页面时,缩放页面宽度,整体超出时滚动条出现在页面最底部,不是悬浮在页面下面,只有滚动到最底部才出现,需要的是悬浮在页面底部,不是滚动到最下面才出现解决方案:在引入页面组件或者最外部div,添加类名然后在mounted的时候监听resizemethods:{......
  • 如何显示页面底部弹窗
    文章目录1.概念介绍2.使用方法2.1固定样式2.2自定义样式3.示例代码4.内容总结我们在上一章回中介绍了"GetMaterialApp组件"相关的内容,本章回中将介绍使用get显示SnackBar.闲话休提,让我们一起TalkFlutter吧。1.概念介绍我们在介绍Get包时提到该提供了一......