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

时间:2015-02-19 15:27:09

标签: android focus android-view setfocus

我试图设置一个组件的可聚焦性并找到这两个方法,希望我可以使用它们使组件只在用户触摸它时可聚焦,而不是以编程方式请求:

myComponent.setFocusable(false);
myComponent.setFocusableInTouchMode(true);

然后我看了their documentation

  

public void setFocusable(boolean focusable)

     

设置此视图是否可以获得焦点。 将此设置为false还可确保此视图在触摸模式下无法对焦。


  

public void setFocusableInTouchMode(boolean focusableInTouchMode)

     

设置此视图在触摸模式下是否可以获得焦点。 将此设置为true还可确保此视图具有可调焦性。

所以,如果任何一个隐含地调用另一个,为什么要区别?

3 个答案:

答案 0 :(得分:4)

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

  1. 调用setFocusableInTouchMode(true)将确保设置FOCUSABLE标记。
  2. 调用setFocusable(false)将确保清除FOCUSABLE_IN_TOUCH_MODE标记。
  3. 换句话说,FOCUSABLE_IN_TOUCH_MODE取决于全局FOCUSABLE标志,如果没有它,则无法设置。

    模式的区别有点遗留。我们的想法是区分用户何时使用D-pad或轨迹球导航UI而不是点击触摸屏。目前,设备几乎总是处于“触摸模式”,但仍有少数情况会检查基础FOCUSABLE标志。主要是从输入法的返回键或打开辅助功能时搜索“下一个”视图时。

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

答案 1 :(得分:2)

总是互相打电话。想象一下,有一个可以通过键盘聚焦的视图而且无法通过触摸事件进行聚焦:

setFocusable(true);
setFocusableInTouchMode(false);

答案 2 :(得分:1)

请注意,调用setFocusable(true)不会调用setFocusableInTouchMode(true)并调用setFocusableInTouchMode(false)不会调用setFocusable(false)。这不平等。