setFocusable和setFocusableInTouchMode有什么区别?

时间:2014-05-22 06:13:02

标签: android focus

Android视图的setFocusablesetFocusableInTouchMode之间有什么区别?

尝试阅读documentation

其他问题

这些与isFocusableisFocusableInTouchMode有什么不同?

2 个答案:

答案 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()为我工作,但documentationrequestFocusInTouchMode()

  

调用此方法以尝试将焦点放在特定视图或其后代之一上。这是requestFocus()的一个特殊变体,它允许在触摸模式下不可聚焦的视图在触摸时请求焦点。

最后,应该注意Romain Guy中所说的post

  

在触摸模式下可以聚焦的视图具有奇怪的交互,除非你完全理解你在做什么,否则你不应该使用它。 requestFocus()有效,但仅在设备未处于触摸模式时显示焦点。一旦用户触摸屏幕,焦点就不再显示。通过做你正在做的事情,你使你的应用程序的行为与系统的其他部分不同,你冒着奇怪的行为。