顾名思义,touch mode就是“触摸模式”。那到底什么是触摸模式呢?从Android官方对touch mode的定义(View-Touch Mode)可以知道:
由于现在大多数Android智能手机设备都支持触摸能力,以致于很容易让开发人员忽略掉touch mode只是Android交互方式的一种。而这种触摸的交互方式不同于方向键和滚动球:在后者交互方式下,Android必须先让控件获得焦点(比如高亮、边框等),用户才知道目前正在操作的是哪一个控件;前者的交互方式则可以通过手指直接触摸点击需要操作的控件,这个时候自然不需要再高亮显示焦点了。
那Android设备什么时候处于touch mode呢?
touch mode是跨Activitys的(across Activitys),任何时候都可以通过调用isInTouchMode()方法来判断设备当前是否处于touch mode状态。而且,设备一旦进入touch mode状态,就会失去控件的selection状态和focus状态(In touch mode, there is no focus and no selection)。
看完上面的介绍,不免产生疑问:通过触摸的方式,触摸任何控件是不是都会获得焦点呢?对于某些控件,为什么用户触摸后会获得焦点并可以输入内容呢?
答案显然是否定的,因为有些控件是不需要获得焦点的,比如Button。Android是考虑这一点的,并提供了API来判断:
Focusable可以理解为控件是否具有获得焦点(Focus)的能力,focusable in touch mode是touch mode下焦点存在的一种特殊形式,这种方式在两种情况下会发生:一是Edit Text接收输入的时候,二是List View的过滤打开时。
在touch mode下,如果isFocusableInTouchMode()为false,用户在触摸屏幕时是无法获取focus的,如果是点击,在ACTION_UP事件到来时,会触发onClickListener;而如果isFocusableInTouchMode()为true,用户通过触摸来点击控件,控件首先会获得focus,如果获取focus成功就不会再触发onClickListener。
相信到这里,应该对touch mode有一个相对清晰的认识了。那么我们在代码中怎么知道设备是不是处于touch mode状态呢,Android官方在View类中提供了以下方法
来判断设备当前是否处于touch mode。
通过上面的了解,发现touch mode是Android设备的一种交互方式。在平时的项目开发中,经常需要获得某个控件的焦点,比如,自动获得某个edit text的焦点,以方便用户输入。
那么,对于大多数智能手机(具有touch mode能力)而言,如何获取view的焦点呢?
Android系统的交互方式有方向键、滚动球和触摸几种方式。采用方向键、滚动球等方式操作,需要通过焦点和高亮来表示此时操作的view;如果设备具备触摸能力,就可以通过触摸而不需要view高亮,这种触摸的交互方式就是touch mode。
由于现在大多数Android智能手机设备都支持触摸能力,以致于很容易让开发人员忽略掉touch mode只是Android交互方式的一种。而这种触摸的交互方式不同于方向键和滚动球:在后者交互方式下,Android必须先让控件获得焦点(比如高亮、边框等),用户才知道目前正在操作的是哪一个控件;前者的交互方式则可以通过手指直接触摸点击需要操作的控件,这个时候自然不需要再高亮显示焦点了。
那Android设备什么时候处于touch mode呢?
对于具有触摸能力的设备,一旦用户触摸到屏幕,设备就进入了touch mode;用户使用方向键或者滚动球时,设备就会退出touch mode。
touch mode是跨Activitys的(across Activitys),任何时候都可以通过调用isInTouchMode()方法来判断设备当前是否处于touch mode状态。而且,设备一旦进入touch mode状态,就会失去控件的selection状态和focus状态(In touch mode, there is no focus and no selection)。
看完上面的介绍,不免产生疑问:通过触摸的方式,触摸任何控件是不是都会获得焦点呢?对于某些控件,为什么用户触摸后会获得焦点并可以输入内容呢?
答案显然是否定的,因为有些控件是不需要获得焦点的,比如Button。Android是考虑这一点的,并提供了API来判断:
只有当view的isFocusableInTouchMode()为true时,view才是可获得焦点的。不同view该值默认不同,例如,Edit Text为true,Button为false。
Focusable可以理解为控件是否具有获得焦点(Focus)的能力,focusable in touch mode是touch mode下焦点存在的一种特殊形式,这种方式在两种情况下会发生:一是Edit Text接收输入的时候,二是List View的过滤打开时。
在touch mode下,如果isFocusableInTouchMode()为false,用户在触摸屏幕时是无法获取focus的,如果是点击,在ACTION_UP事件到来时,会触发onClickListener;而如果isFocusableInTouchMode()为true,用户通过触摸来点击控件,控件首先会获得focus,如果获取focus成功就不会再触发onClickListener。
相信到这里,应该对touch mode有一个相对清晰的认识了。那么我们在代码中怎么知道设备是不是处于touch mode状态呢,Android官方在View类中提供了以下方法
boolean isInTouchMode()
来判断设备当前是否处于touch mode。
通过上面的了解,发现touch mode是Android设备的一种交互方式。在平时的项目开发中,经常需要获得某个控件的焦点,比如,自动获得某个edit text的焦点,以方便用户输入。
那么,对于大多数智能手机(具有touch mode能力)而言,如何获取view的焦点呢?
请看下篇。