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

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

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

然后我看了their documentation

public void setFocusable (boolean focusable)

Set whether this view can receive the focus. Setting this to false will also ensure that this view is not focusable in touch mode.

public void setFocusableInTouchMode (boolean focusableInTouchMode)

Set whether this view can receive focus while in touch mode. Setting this to true will also ensure that this view is focusable.

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

解决方法

视图系统中有两个标志: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的“焦点处理”和“触摸模式”部分.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...