Android视图的setFocusable
和setFocusableInTouchMode
之间有什么区别?
其他问题:
这些与isFocusable
和isFocusableInTouchMode
有什么不同?
答案 0 :(得分:24)
setFocusable 主要用于在触摸模式和键盘模式下启用/禁用视图的焦点事件(使用上/下/下一键)。
setFocusableInTouchMode 主要用于仅在触摸模式下启用/禁用视图的焦点事件。
如果您已停用 setFocusable ,它还会在触摸模式下禁用视图的焦点事件。
答案 1 :(得分:20)
在阅读了@Raj的答案后,通过Android documentation并尝试了代码,我想我明白他们现在的工作方式有点好。如果其他人同样困惑,这里还有一点额外的帮助。如果我弄错了,请告诉我。
观点可以集中或不集中。一些观点在重点突出时会改变它们的外观。当使用键盘导航布局时,这尤其有用。这样,您可以在实际单击视图之前知道自己的位置。甚至在焦点可以通过using a selector and drawables进行聚焦时也不会自然改变的视图。但是,如果您没有使用键盘进行导航,那么焦点就不那么重要了。
有三对令我困惑的事情:
isFocusable()
isFocusableInTouchMode()
setFocusable()
setFocusableInTouchMode()
requestFocus()
requestFocusFromTouch()
第一对只是告诉您有关视图的信息。也就是说,是否有可能集中该视图。你可以通过这样的事情找到答案:
Boolean b = myView.isFocusable();
触摸屏幕后,您处于触摸模式。因此,当您使用键盘时,可能无法调焦的东西可能无法调焦。您可以这样检查:
Boolean b = myView.isFocusableInTouchMode();
就像我说的那样,这只会告诉你关于是否可能给出视图焦点的信息。如果你想实际给予视图焦点,首先你必须让它成为焦点。您可以使用以下命令之一执行此操作:
myView.setFocusable(true);
myView.setFocusableInTouchMode(true);
如果您处于触摸模式并且致电setFocusableInTouchMode(true)
,则myView.isFocusable()
和myView.isFocusableInTouchMode()
都将返回true。你不需要同时打电话给他们。但是,如果您只拨打myView.setFocusable(true)
,则不会更改myView.isFocusableInTouchMode()
。
现在,为了最终使视图集中,您必须调用以下内容:
myView.requestFocus();
我仍然不完全理解requestFocusInTouchMode()
,因为只使用requestFocus()
为我工作,但documentation说requestFocusInTouchMode()
:
调用此方法以尝试将焦点放在特定视图或其后代之一上。这是requestFocus()的一个特殊变体,它允许在触摸模式下不可聚焦的视图在触摸时请求焦点。
最后,应该注意Romain Guy中所说的post:
在触摸模式下可以聚焦的视图具有奇怪的交互,除非你完全理解你在做什么,否则你不应该使用它。 requestFocus()有效,但仅在设备未处于触摸模式时显示焦点。一旦用户触摸屏幕,焦点就不再显示。通过做你正在做的事情,你使你的应用程序的行为与系统的其他部分不同,你冒着奇怪的行为。