android:focusable
之所以有这个属性主要是因为Android系统不仅仅是针对手机的,有可能在电视、手表等等的非触摸输入设备上(如Android TV),这些设备只有物理上下键不具备触摸功能,
那么当把这个属性值设置为true的时候,比方说你按了一下向下键,屏幕上的内容就会对应选中一个向下的控件(如果这个控件设置android:focusable = true的话),否则
就会选中下一个具备focusable能力的控件。

android:focusableInTouchMode
与上面那种情况相反,如果是针对手机开发的话,那么大部分手机都具备触摸功能,那么这个属性有什么作用呢?
从交互的角度上讲,焦点的作用其实就是为了提示用户当前控件已被选中了,可以进行下一步的操作。比如在Android 5.0上新推出的Material Design效果上面,如果一个EditText被选中了,那么它的
输入框就会更换颜色以示区别。但是在手机开发中并不是所有的控件都需要有选中这种状态,通常在点击后可能只想达到某种效果(如点击按钮就是想触发点击事件,不需要有选中效果),那么这个时候
如果把focusableInTouchMode设置为true,此时执行的就是更换焦点操作,相应的事件就无法及时得到响应,这样的体验就很不好。
例:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ddffff"
android:gravity="center"
android:orientation="vertical"
android:focusableInTouchMode="true"
> <View
android:id="@+id/view_test"
android:layout_width="100dip"
android:layout_height="100dip"
android:focusableInTouchMode="true"
android:background="#ff0000"
/> <Button
android:id="@+id/bt_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"
android:text="click me"
android:focusableInTouchMode="true"
/> </LinearLayout>

我们分别为 LinearLayout , View , Button 都增加一个触摸时能够获取到焦点的属性。

package com.yuneec.testdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button; public class MainActivity extends AppCompatActivity { private View view_test;
private Button bt_test; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); view_test = findViewById(R.id.view_test);
bt_test = (Button) findViewById(R.id.bt_test); view_test.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("xp.chen", "I am view, click................");
}
}); view_test.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
Log.i("xp.chen", "==========================================");
Log.i("xp.chen", "I am view, focus: "+view_test.isFocused());
Log.i("xp.chen", "I am button, focus: "+bt_test.isFocused());
}
}); bt_test.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("xp.chen", "I am button, click................");
}
}); bt_test.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
Log.i("xp.chen", "==========================================");
Log.i("xp.chen", "I am button, focus: "+bt_test.isFocused());
Log.i("xp.chen", "I am view, focus: "+view_test.isFocused());
}
});
} }

我们先点击View, 发现View的onClick事件并未打印,再点击View,发现View的OnClick事件可以正常打印了;

然后再点击Button,发现Button的OnClick事件也未打印,再点击一次Button,发现Button的onClick事件可以正常打印了。

这说明第一次点击View或者Button,只是单纯的将焦点转换到了View或者Button上,此时会调用 OnFocusChangeListener 方法,只有当再次点击的时候才会调用onClick方法。

因此,这种操作对Button来说是多余的(我点击哪个Button,就意味着我想触发哪个Button的onClick事件, 不是说点击哪个Button,先去让这个Button获得焦点),而Button的 android:focusableInTouchMode 属性默认也就是false。

但对  EditText 这种控件来说就不一样了,比方说一个界面上有很多 EditText ,在用户点击了其中一个的时候,就代表用户想要在这个EditText里进行输入,那么这个EditText就必须立即获得焦点,弹出软键盘等待用户输入。事实上在Android源代码里面,EditText的 android:focusableInTouchMode  属性默认也就是 true 。参见AOSP中对EditText的属性定义:

<style name="Widget.EditText">
<item name="android:focusable">true</item>
<item name="android:focusableInTouchMode">true</item>
<item name="android:clickable">true</item>
<item name="android:background">?android:attr/editTextBackground</item>
<item name="android:textAppearance">?android:attr/textAppearanceMediumInverse</item>
<item name="android:textColor">?android:attr/editTextColor</item>
<item name="android:gravity">center_vertical</item>
</style>

可以尝试下将EditText的 android:focusableInTouchMode 属性设置为false,这样在手机上点击EditText,由于获取不到焦点,软键盘无法弹出。

参考链接:

Android中最详细的焦点问题,从概念出发带你一点点分享(1)

EditText: android:focusable和android:focusableInTouchMode的区别的更多相关文章

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

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

  2. 关于android:focusable属性

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

  3. 【整理】Android中的gravity和layout_gravity区别

    [背景] 在Android中,想要设置个按钮的水平对齐,都累死了: [已解决]ADT中已设置TableLayout布局的情况下如何设置按钮居中对齐    所以现在有必要搞清楚,到底gravity和la ...

  4. Android View的onTouchEvent和OnTouch区别

    还是以自定义的TestButton为例. 我们可以通过重写onTouchEvent方法来处理诸如down move up的消息: public class TestButton extends But ...

  5. Android中layout_gravity和gravity的区别

    安卓中的 layout_gravity 属性和 gravity属性 有啥区别? LinearLayout有两个非常相似的属性: android:gravity与android:layout_gravi ...

  6. android:layout_gravity 和 android:gravity 的区别

    gravity 这个英文单词是重心的意思,在这里就表示停靠位置的意思. android:layout_gravity 和 android:gravity 的区别 从名字上可以看到,android:gr ...

  7. android:layout_gravity和android:gravity的区别

    1.首先来看看android:layout_gravity和android:gravity的使用区别. android:gravity: 这个是针对控件里的元素来说的,用来控制元素在该控件里的显示位置 ...

  8. android:layout_gravity和android:gravity属性的区别

    一.介绍: gravity的中文意思就是”重心“,就是表示view横向和纵向的停靠位置 (1).android:gravity:是对view控件本身来说的,是用来设置view本身的内容应该显示在vie ...

  9. 【转】android:layout_gravity和android:gravity的区别

    1.首先来看看android:layout_gravity和android:gravity的使用区别. android:gravity: 这个是针对控件里的元素来说的,用来控制元素在该控件里的显示位置 ...

随机推荐

  1. SSH黄金参数

    ssh -o ConnectTimeout=3 -o ConnectionAttempts=5 -o PasswordAuthentication=no -o StrictHostKeyCheckin ...

  2. Javascript判断Crontab表达式是否合法

    这段时间在做Quartz任务调度,使用的Crontab表达式实现的.Crontab由前端页面输入,作为参数穿入后台. 虽然Quartz具有校验Crontab表达式的方法,如下: boolean cro ...

  3. 推断Windows版本号新方法

    曾经在代码中推断用户的Windows操作系统版本号都是通过GetVersion或GetVersionEx获取版本号号,然后比較. 今天偶然发如今新的Visual Studio提供了新的函数来推断系统版 ...

  4. ASP.NET 动态查找数据 并且生成xml文档 同时使用xslt转换为xhtml

    前言 xsl是一门标签解析语言,很适合做动态网页的前台标签 www.bamn.cn 1 首先是aspx页面 添加一个输入框 按钮 还有一个用来显示解析后的xhtml代码的控件 <form id= ...

  5. 导致线程死锁容易忽略的一点 SendMessage

    假如主线程 某一个按钮 点击的 响应要操作与另一个线程共享的 变量. 在这个点击响应里先lock 之后,假如另一个线程的变量正在 “使用”状态,并且内部又调用了SendMessage试图更新界面的某些 ...

  6. unix环境高级编程 读书笔记

    1.上班业余时间把书下载下来,第一章读完了,但是程序只能回家运行啦!Fighting!

  7. 利用图片中的exif元数据批量查找图片中所包含的GPS信息

    在图片的exif(交换图像文件格式)中标准定义了如何存储图像和音频文件的标准,而在这些标签中往往存在了一些容易被人们忽视却又重要的东西. 有一款工具名为exiftool,可以快速的解析所有标签,并将结 ...

  8. 【colaboratory】在colab中安装mxnet

    在学习<动手学深度学习>内容是,该内容用的是mxnet框架,在电脑本地安装过程中又容易出现错误,怎么也安装不上,所有的条件都尝试了. 汗颜,指的另谋他法. 只有在谷歌的学习平台上安装使用h ...

  9. cucumber java从入门到精通(2)用代码定义步骤

    cucumber java从入门到精通(2)用代码定义步骤 上一节里我们定义了feature文件,feature文件就是自然语言描述的用例文件,它有一定的章法,具体的潜规则是: 使用Feature关键 ...

  10. java基础知识总结(二)

    +=隐含了强制类型转换. x+=y;等价与:x = (x的数据类型)(x + y); 函数重载? 函数名同样.參数列表不同.跟返回值不关,就是函数重载 封装是什么? 隐藏对象的属性和详细的实现细节,仅 ...