为什么Android中有2个setFocusable方法?

Ben*_*ero 3 android focus setfocus android-view

我试图设置组件的可聚焦性,并找到了这两种方法,希望我可以使用它们使组件仅在用户触摸时才可聚焦,而不能通过编程方式请求:

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

然后我查看了他们的文档

public void setFocusable(布尔型可聚焦)

设置此视图是否可以接收焦点。将其设置为false还将确保该视图在触摸模式下无法聚焦。


public void setFocusableInTouchMode(布尔的focusableInTouchMode)

设置在触摸模式下此视图是否可以接收焦点。将其设置为true也将确保该视图可聚焦。

那么,如果隐式调用任何一个,则为什么要区分?

Dev*_*red 5

视图系统中有两个标志:FOCUSABLEFOCUSABLE_IN_TOUCH_MODE。每种方法都设置/清除其各自的标志,并且在两种情况下,一种方法会影响另一种方法的状态:

  1. 调用setFocusableInTouchMode(true)将确保FOCUSABLE设置该标志。
  2. 调用setFocusable(false)将确保FOCUSABLE_IN_TOUCH_MODE清除该标志。

换句话说,FOCUSABLE_IN_TOUCH_MODE取决于全局FOCUSABLE标志,没有全局标志就无法设置。

模式上的区别有点旧。这个想法是要区分用户何时使用D-pad或轨迹球浏览UI与点击触摸屏之间。如今,设备几乎总是处于“触摸模式”,但是在某些情况下FOCUSABLE会检查基础标志。主要是在从输入法的返回键中搜索“下一个”视图时或在打开辅助功能时。

有关不同模式的更多详细信息,您可以阅读SDK View Documentation的“焦点处理”和“触摸模式”部分。