为什么ListView和RecyclerView是focusableInTouchMode?

时间:2015-08-02 00:36:12

标签: android android-listview android-recyclerview

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可以调焦(/可在触摸模式下专注)。

0 个答案:

没有答案