setFocusable和setFocusableInTouchMode有什么区别?

Sur*_*gch 14 android focus

setFocusablesetFocusableInTouchModeAndroid视图有什么区别?

尝试阅读文档后的其他问题:

这些isFocusableisFocusableInTouchMode?有什么不同?

小智 26

setFocusable主要用于在触摸模式和键盘模式下启用/禁用视图的焦点事件(使用上/下/下一个键).

setFocusableInTouchMode主要用于单独在触摸模式下启用/禁用视图的焦点事件.

如果禁用了setFocusable,它还会在触摸模式下禁用视图的焦点事件.


Sur*_*gch 21

在阅读了@Raj的答案,浏览Android 文档并尝试代码之后,我想我明白他们现在的工作方式有点好.如果其他人同样困惑,这里还有一点额外的帮助.如果我弄错了,请告诉我.

观点可以集中或不集中.一些观点在重点突出时会改变它们的外观.当使用键盘导航布局时,这尤其有用.通过这种方式,您可以在实际单击视图之前知道自己的位置.甚至可以通过使用选择器和绘图来实现焦点时不会自然改变的视图.但是,如果您没有使用键盘进行导航,那么焦点就不那么重要了.

有三对令我困惑的东西:

isFocusable()
isFocusableInTouchMode()

setFocusable()
setFocusableInTouchMode()

requestFocus()
requestFocusFromTouch()
Run Code Online (Sandbox Code Playgroud)

第一对只是告诉您有关视图的信息.也就是说,是否有可能集中该视图.你可以通过这样的事情找到答案:

Boolean b = myView.isFocusable();
Run Code Online (Sandbox Code Playgroud)

触摸屏幕后,您处于触摸模式.因此,当您使用键盘时,可能无法调焦的东西可能无法调焦.你可以这样检查:

Boolean b = myView.isFocusableInTouchMode();
Run Code Online (Sandbox Code Playgroud)

就像我说的那样,这只会告诉你关于是否有可能给予视图焦点的信息.如果你想实际给予视图焦点,首先你必须让它成为焦点.您可以使用以下命令之一执行此操作:

myView.setFocusable(true);
myView.setFocusableInTouchMode(true);
Run Code Online (Sandbox Code Playgroud)

如果你是在触摸模式,你叫setFocusableInTouchMode(true)那么这两个myView.isFocusable()myView.isFocusableInTouchMode()将返回true.您无需同时调用它们.但是,如果你只是打电话,myView.setFocusable(true)那么myView.isFocusableInTouchMode()就不会改变.

现在,为了最终使视图集中,您必须调用以下内容:

myView.requestFocus();
Run Code Online (Sandbox Code Playgroud)

我仍然不完全理解,requestFocusInTouchMode()因为只是requestFocus()为我工作,但文档requestFocusInTouchMode():

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

最后,应该指出Romain Guy在这篇文章中说:

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