android 焦点问题

作者: 过期的薯条 | 来源:发表于2017-07-16 12:07 被阅读41次

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"

   <Button
        android:id="@+id/button"
        android:text="焦点测试"
        android:focusableInTouchMode="true"
        android:layout_marginTop="15dp"
        android:layout_width="match_parent"
        android:layout_height="60dp"/>

结果:

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

相关文章

  • android 焦点问题

    1.引言 一直以来对焦点问题都是模模糊糊的只知道用android:focusableInTouchMode, an...

  • Android 焦点问题

    在Android开发中,如果edittext在布局前方,那么会默认弹出软键盘。使得体验非常的不好,这个时候,可以加...

  • Android焦点问题

    Android焦点分发主要涉及的方法就是findFocus:View都有,发现焦点requestFocus:Vie...

  • android TV 焦点问题

    近期在处理一个问题,就是TV盒子在遥控器操作的时候,焦点没法高亮的问题。在网上辗转搜索,仍然没有一个精确的方案,于...

  • 【Android】Scrollview焦点问题

    Scrollview中内容改变后自动滑动到底部的问题 将scrollview包裹的内容设置上以下俩个熟悉andro...

  • android view 选中效果高光消除

    扫码qiang禁用键盘,然后焦点就有问题。可以定义一个view抢占焦点,避免焦点乱跑。使用android:defa...

  • Android中EditText焦点问题

    最近在项目中碰到EditText的焦点问题,特此记录下,以便遇到相同问题的朋友参考。 问题:当EditText失去...

  • Android VidowView音频焦点问题

    前言 好久没有发布文章了,整个5月底6月初的状态都在准备复习与面试的路上,最终选择了一家薪资待遇都不错的公司。之后...

  • Android TV 焦点丢失问题

    在Android 9.0及以上设备,存在绘制渲染的速度比较快,数据还没填充完就已经绘制完成,这时候焦点就会丢失。需...

  • android 键盘遮挡、显示隐藏、默认焦点等问题

    android 中关于键盘和焦点的问题,有时候处理不好,真的让人抓狂,昨天在实现需求的时候被键盘和焦点的问题搞得难...

网友评论

    本文标题:android 焦点问题

    本文链接:https://www.haomeiwen.com/subject/qmcahxtx.html