我试图设置一个组件的可聚焦性并找到这两个方法,希望我可以使用它们使组件只在用户触摸它时可聚焦,而不是以编程方式请求:
myComponent.setFocusable(false);
myComponent.setFocusableInTouchMode(true);
然后我看了their documentation:
public void setFocusable(boolean focusable)
设置此视图是否可以获得焦点。 将此设置为false还可确保此视图在触摸模式下无法对焦。
public void setFocusableInTouchMode(boolean focusableInTouchMode)
设置此视图在触摸模式下是否可以获得焦点。 将此设置为true还可确保此视图具有可调焦性。
所以,如果任何一个隐含地调用另一个,为什么要区别?
答案 0 :(得分:4)
视图系统中有两个标记:FOCUSABLE
和FOCUSABLE_IN_TOUCH_MODE
。每个方法都设置/清除其各自的标志,并且有 两个 的情况,其中一个方法影响另一个方法的状态:
setFocusableInTouchMode(true)
将确保设置FOCUSABLE
标记。setFocusable(false)
将确保清除FOCUSABLE_IN_TOUCH_MODE
标记。换句话说,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)。这不平等。