1.引言

一直以来对焦点问题都是模模糊糊的只知道用android:focusableInTouchMode, android:focusable="true"。但是对他们并不是很理解.所以准备来彻彻底底的搞清楚android 里面的焦点问题。

2.正题

查看android api里面对focus的描述:

Paste_Image.png

结论
setFocusable(true):表示此 View仅仅是能获得焦点。
焦点的移动是采用给定方向上找到最近邻居的算法。
view..requestFocus()请求获得焦点

Paste_Image.png

结论
对于触摸能力的设备,一旦用户触摸屏幕,设备将进入触摸模式。从这一刻起,只有isfocusableintouchmode()为true的View 将能得到焦点,如文本编辑控件。可触摸的View,如按钮,不会占用焦点;他们只会触发Click监听。

3.试验测试

3.1 测试1

xml样式如下:很平常的LinearLayout布局。

Paste_Image.png

MainActivity:

editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {            @Override            public void onFocusChange(View view, boolean b) {                if (b) {                    Log.d(ss,"+++++++++++++++++++++++++++++edit获取焦点");                }            }        });        button.setOnFocusChangeListener(new View.OnFocusChangeListener() {            @Override            public void onFocusChange(View view, boolean b) {                if (b) {                    Log.d(ss,"+++++++++++++++++++++++++++++button获取焦点");                }            }        });        edit1.setOnFocusChangeListener(new View.OnFocusChangeListener() {            @Override            public void onFocusChange(View view, boolean b) {                if (b) {                    Log.d(ss,"+++++++++++++++++++++++++++++edit1获取焦点");                }            }        });        textView.setOnFocusChangeListener(new View.OnFocusChangeListener() {            @Override            public void onFocusChange(View view, boolean b) {                if (b) {                    Log.d(ss,"+++++++++++++++++++++++++++++text获取焦点");                }            }        });        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                Toast.makeText(MainActivity.this, "click", Toast.LENGTH_SHORT).show();            }        });

正常情况下的结果(Button下面的输入框获取了焦点):

Paste_Image.png

3.2 测试2

修改button的xml:添加android:focusableInTouchMode="true"

   

结果:

Paste_Image.png

由上俩个例子总结:
button默认是:android:focusableInTouchMode=“false”的
EditText默认是:android:focusableInTouchMode=“true”的

同时也验证了上面的话:焦点的移动是采用给定方向上找到最近邻居的算法。

3.3.分析ListView item点击不了的原因

都知道当listview的item 由button,checkbox,edit的时候 ,点击item是无法获取onitemclick的监听的。
OnItemClickListener的监听的调用者是AbsListView。AbsListView继承AdapterView。

Paste_Image.png

当child能获取到焦点或者child的子View中有能获取到焦点的View。那么是不能执行performClick。performClick实际上就是调用的adapter的onitemClick事件。

我们知道input类型的控件,通过测试验证了,Button,EditView,CheckBox等控件都是可以获取到焦点的存在。故而不是执行performClick

验证:item的布局只有一个TextView,因此能响应onItemClick事件。但是假如加入了focusable=“true”。他是否还能响应呢?结果是不能响应的。

gif.gif

更多相关文章

  1. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
  2. Android外设存储设备的访问及测试
  3. Android(安卓)UI事件处理[isInTouchMode()]
  4. android的PreferenceActivity
  5. Android中的几种网络请求方式详解
  6. android 流量管理
  7. Android(安卓)Wi-Fi基本操作
  8. Android:自定义控件你应该知道的这些事_TypedArray
  9. Android(安卓)文件打开方式

随机推荐

  1. android下开源项目
  2. Android文件目录结构
  3. Android导出一个JAR库/Android如何将程序
  4. Android计算器简单逻辑实现
  5. Android(安卓)Studio上非常棒的插件
  6. 【Android】注解框架(二)-- 基础知识(Java注
  7. Android 开源项目-StandupTimer学习笔记
  8. 发掘美丽的 Android 桌面
  9. Android Studio无法新建创建android工程
  10. Android Studio设置主题 和 不支持中文的