ListView(或精确的AbsListView)和RecyclerView在其构造函数中调用setFocusableInTouchMode(true)
。
根据我的理解(部分取消this ancient post by Romain Guy)和(有限)构建键盘访问应用程序的经验,应用程序需要启用此属性非常罕见。
在帖子中,他解释道:
此特殊模式是为接收文本输入的小部件创建的,如EditText,或者在启用过滤时,ListView。
我理解EditText,当用户触摸它时可以获得焦点(可在触摸模式下聚焦),这样键输入就可以指向正确的视图(如果您考虑使用多个EditTexts的情况,这很容易理解)单屏)。
我不会遵循"过滤"的含义。 (以及为什么需要启用此属性),以及为什么在构造函数中默认设置它。
我遇到的问题(提示这个问题)是我试图在ViewPager中启用键盘导航的时候。这就是我最终的结果:
每个页面都是RecyclerView。 RecyclerView中的每个项目视图都是可聚焦的,并且具有正确的焦点和按下状态,如gif中所示。
理想情况下(我的结果并不理想),如果用户专注于位置X,并向右导航,那么他们应该在下一列的相应行中:
[ ][ ]|[ ][ ] [ ][ ]|[ ][ ]
[ ][X]|[ ][ ] -> [ ][ ]|[X][ ]
[ ][ ]|[ ][ ] [ ][ ]|[ ][ ]
通过默认,因为RecyclerView可以在触摸模式下聚焦(因此可以根据定义进行聚焦),右侧的整个RecyclerView会获得焦点,但用户不知道发生了什么。他们必须按下,然后RecyclerView会关注任何可用的孩子:
[ ][ ]|[ ][ ] [ ][ ]|[ ][ ] [ ][ ]|[X][ ]
[ ][X]|[ ][ ] -> [ ][ ]|[ ][ ] v [ ][ ]|[ ][ ]
[ ][ ]|[ ][ ] [ ][ ]|[ ][ ] [ ][ ]|[ ][ ]
它最终出现在布局的第一个视图中。
因此,您可以在RecyclerView上的RecyclerViews 或调用android:descendantFocusability
上将afterDescendants
属性设置为setFocusable(false)
(无法在在构造函数调用setFocusableInTouchMode(true)
之前设置的XML,意味着它将直接转到布局的第一个视图:
[ ][ ]|[ ][ ] [ ][ ]|[X][ ]
[ ][X]|[ ][ ] -> [ ][ ]|[ ][ ]
[ ][ ]|[ ][ ] [ ][ ]|[ ][ ]
(如果向左按,从右页向左,则它将转到最后布置的视图。)
我选择了descendantFocusability
属性,虽然这种方法效果不错(但理想情况下并不如图所示),但我不明白为什么AbsListView和RecyclerView可以调焦(/可在触摸模式下专注)。