在学习 ListView 源码时,发现了 Focusable in Touch Mode 这个概念,注释的意思是:

whether this view can receive focus while in touch mode

字面意思是 一个 View 在 touch mode 下是否可以接收焦点。

什么是 touch mode 呢?

下面总结 官方文档 Touch Mode 的介绍:

Touch Mode

由于现在安卓手机基本都是触摸屏,导致我们没有意识到 Touch Mode 其实是一种特殊的状态,不同于 Selection, Focus。

在几年前,有些安卓手机上面还保留着键盘、触摸球(上图红色圈内),这个触摸球的作用相当于现在电视遥控器的上下左右键。

当我们用手触摸屏幕选中内容后,会进入 Touch Mode

但是当我们用触摸球左右移动(按下遥控器方向键也一样)时,就会离开 Touch Mode;

听起来似乎很简单,但是一个控件还有其他状态,当这些状态切换时,你就要小心搞晕了。

Touch Mode, Selection, and Focus

安卓手机在过去的几年里经历了多种输入方式,比如手指、电容笔、 键盘、触摸球等等,开发人员需要对这些不同的操作有不同的响应。

现在的安卓应用开发比那个年代要轻松多了,但是在物联网发展下,我们还要考虑智能电视等其他智能设备的这些输入情景。

想象一下,有一个 ListView,当我们选中一个 Item 时,会进入 selected 状态 :

但是当我们按着的同时滑动手指,ListView 会滑动,同时你选中的这个 Item 会退出 selected 状态,你可以试试。

为什么会这样呢?

根据 官方文档 可以知道,framework 层为了降低有多种输入方式((比如同时支持触摸和遥控的智能电视)的情况下状态保持的复杂性,规定 In touch mode, there is no focus and no selection ,一旦一个 View 进入 touch mode, 它的 focused 和 selected 状态会被去掉。

In touch mode, there is no focus and no selection.

好的,我记住了。

但是!还有例外情况。

→_→

Focusable in Touch Mode

一般情况下在 touch mode 时会退出 focused 状态,但是在有些情况下我们希望在 touch mode 时仍然保持 focused 状态,于是有了这个值 focusableInTouchMode, 常用在 输入框 EditText 或者 ListView。

EditText 默认 focusableInTouchMode 为 true,因此我们点击后它才能获取焦点,当我们设置 EditText focusableInTouchMode 为 false 时,点击后获取不到焦点,也就无法输入。

当我们设置 ListView 的 focusableInTouchMode 为 false 时,它的 item 也无法获取不到焦点,这在有的场景下会有用处。

由于设置了这个属性后会引起正常交互不一致的效果,所以官方建议我们保守地使用这个属性,在你确定要用它之前最好三思而后行。

感谢:

http://android-developers.blogspot.fi/2008/12/touch-mode.html

http://www.cnblogs.com/xiaoweiz/p/3833079.html

http://zhidao.baidu.com/link?url=XIgERGPVdEqYduRPs-_IGBiSLI0Gt1ATvsb4gJdVCcblf_qyR2Pxc1ukkLIqtwT4zdlPQ7sO9HjMuxWarkGnt8CuYMTKzw5OVYG4kBXR_Sy

http://blog.csdn.net/fancylovejava/article/details/46973397

Android Focusable in Touch Mode 介绍的更多相关文章

  1. Android 编程下 Touch 事件的分发和消费机制

    Android 中与 Touch 事件相关的方法包括:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev). ...

  2. 关于android:focusable属性

    http://www.cnblogs.com/Gaojiecai/archive/2013/06/18/3142783.html Android属性 android:focusableInTouchM ...

  3. Android中的Touch事件

    Android中的Touch事件处理 主要内容 Activity或View类的onTouchEvent()回调函数会接收到touch事件. 一个完整的手势是从ACTION_DOWN开始,到ACTION ...

  4. Android系统性能调优工具介绍

    http://blog.csdn.net/innost/article/details/9008691 经作者授权,发表Tieto某青年牛的一篇<程序员>大作. Android系统性能调优 ...

  5. 怎么通过activity里面的一个按钮跳转到另一个fragment(android FragmentTransaction.replace的用法介绍)

    即:android FragmentTransaction.replace的用法介绍 Fragment的生命周期和它的宿主Activity密切相关,几乎和宿主Activity的生命周期一致,他们之间最 ...

  6. Android 之 资源文件的介绍及使用

    Android 之 资源文件的介绍及使用 1.资源的简单介绍:  在res文件夹中定义:字符串.颜色.数组.菜单.图片.视频等:在应用程序中使用这些资源.  2.使用资源的长处:降低代码量,同一时候为 ...

  7. android之ListView,详细介绍实现步骤,举例,自定义listview适配器

    android之ListView,详细介绍实现步骤,举例,自定义listview适配器 本文来源于www.ifyao.com禁止转载!www.ifyao.com android中如何使用listVie ...

  8. 奇怪的问题:android:focusable和android:clickable造成ListView的点击不了

    今天花了我很长时间,才解决一个很奇怪的问题,就是在ListView的点击反应不了的问题…… 在ListView中,如果其中一个元素设置为android:focusable="true&quo ...

  9. Android 根据规划 Touch 分配和消费机制的事件

    Android 中与 Touch 事件相关的方法包含:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev). ...

随机推荐

  1. POJ--2158--------------Milking Grid(最小覆盖字符矩阵)---(开二维kmp)

    Milking Grid Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6169   Accepted: 2573 Desc ...

  2. Android receiver

    可以在代码文件中声明一个receiver,也可以在manifest中声明一个,前者中的receiver只有在该activity launch起来以后才会监听其所感兴趣的事件, 而如果在androidM ...

  3. oracle序列为什么不是从1开始

    问题原因: ·当我们使用序列作为插入数据时,如果使用了“延迟段”技术,则跳过序列的第一个值 ·Oracle从 11.2.0.1版本开始,提供了一个“延迟段创建”特性: 即 当我们创建了新的表(tabl ...

  4. jQuery制作瀑布流(转)

    “瀑布流布局”随着pinterest网的流行而出名,现在国内使用这种风格布局的网站也越来越多,比如说Mark之,蘑菇街,点点网,哇哦等等.我第一次听到这个布局名称是来自于“乔花写的<瀑布流布局浅 ...

  5. 流控panabit的安装及配置

    软件: 在panabit的下载页面上,没有最新的版本.刚开始就是从这个地方下载的,但是有一块网卡怎么也找不到.各种加载网卡驱动,最后失败. 之后,从其论坛中发现了最新的2013.05版本,将ISO刻盘 ...

  6. 使用MediaPlayer和SurfaceView播放视频

    使用VideoView播放视频简单.方便,丹有些早期的开发者更喜欢使用MediaPlayer来播放视频,但由于MediaPlayer主要用于播放音频,因此它没有提供图像输出界面,此时 需要借助于Sur ...

  7. list集合的遍历3种方法

    package com.sort; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** ...

  8. POJ 1753 Flip Game 状态压缩,暴力 难度:1

    Flip Game Time Limit: 1000MS  Memory Limit: 65536K  Total Submissions: 4863  Accepted: 1983 Descript ...

  9. 安装VMWare tools,以及解决安装后/mnt中有hgfs但没共享文件的方法

    一.首先是安装VMWare tools   安装过程可参考:Installing VMware Tools in an Ubuntu virtual machine   安装成功后,可看的如下信息: ...

  10. arm-linux-gcc-4.3.2安装步骤

        安装交叉编译工具链: 1.首先以root用户登入 2.复制arm-linux-gcc-4.3.2.tgz到根目录下tmp文件夹里 3.解压命令tar xvzf arm-linux-gcc-4. ...