ata*_*ulm 7 android android-listview android-recyclerview
ListView(或精确的AbsListView)和RecyclerView调用setFocusableInTouchMode(true)它们的构造函数.
根据我的理解(部分取决于Romain Guy的这篇古老文章)和(有限的)构建键盘可访问应用程序的经验,应用程序需要启用此属性是非常罕见的.
在帖子中,他解释说:
此特殊模式是为接收文本输入的小部件创建的,如EditText,或者在启用过滤时,为ListView创建.
我理解EditText,它可以在用户触摸它时获得焦点(可在触摸模式下聚焦),这样键输入就可以指向正确的视图(如果您考虑在单个屏幕上使用多个EditTexts的情况,这很容易理解) .
我不遵循"过滤"的含义(以及为什么需要启用此属性),也不遵循构造函数中默认设置的原因.
我遇到的问题(提示这个问题)是我试图在ViewPager中启用键盘导航的时候.这就是我最终得到的结果:

每个页面都是RecyclerView.RecyclerView中的每个项目视图都是可聚焦的,并且具有正确的焦点和按下状态,如gif中所示.
理想情况下(并且我的结果并不理想),如果用户关注位置X并向右导航,那么它们应该位于下一列的相应行中:
[ ][ ]|[ ][ ] [ ][ ]|[ ][ ]
[ ][X]|[ ][ ] -> [ ][ ]|[X][ ]
[ ][ ]|[ ][ ] [ ][ ]|[ ][ ]
Run Code Online (Sandbox Code Playgroud)
通过默认情况下,因为RecyclerView在触摸模式可聚焦(从而通过定义可调焦),右侧涨幅整个RecyclerView关注,但用户不知道发生了什么.他们必须按下,然后RecyclerView会关注任何可用的孩子:
[ ][ ]|[ ][ ] [ ][ ]|[ ][ ] [ ][ ]|[X][ ]
[ ][X]|[ ][ ] -> [ ][ ]|[ ][ ] v [ ][ ]|[ ][ ]
[ ][ ]|[ ][ ] [ ][ ]|[ ][ ] [ ][ ]|[ ][ ]
Run Code Online (Sandbox Code Playgroud)
它在布局的第一个视图中结束.
所以,你可以在设置android:descendantFocusability属性afterDescendants上RecyclerViews 或致电setFocusable(false)(因为它的构造函数调用之前设置不能做到这一点在XML的RecyclerView setFocusableInTouchMode(true)),这意味着它会直接转到铺设了第一种观点:
[ ][ ]|[ ][ ] [ ][ ]|[X][ ]
[ ][X]|[ ][ ] -> [ ][ ]|[ ][ ]
[ ][ ]|[ ][ ] [ ][ ]|[ ][ ]
Run Code Online (Sandbox Code Playgroud)
(如果向左按,从右页向左,则它将转到最后放置的视图.)
我选择了该descendantFocusability属性,虽然这种方法运行良好(但理想情况下不如图),我不明白为什么AbsListView和RecyclerView可以聚焦(/可在触摸模式下聚焦).
| 归档时间: |
|
| 查看次数: |
1158 次 |
| 最近记录: |