Bootstrap

Android 焦点Focus问题的总结

clickable=”true”

所有的获取焦点,都要有一个前提,那就是该控件必须设置android:clickable=”true”。

focusable和focusableInTouchMode的区别

  • focusable
    针对在键盘下操作的情况,比如非触屏手机或者TV,如果设置为true,则键盘上下左右选中,焦点会随之移动。
  • focusableInTouchMode
    显然是针对触屏情况下的,也就是我们点击屏幕的上的某个控件时,不要立即执行相应的点击逻辑,而是先显示焦点(即控件被选中),再点击才执行逻辑。
  • 总结
    这两个属性都是表示是否可以获取焦点,focusableInTouchMode是针对触屏的。
    android:focusable=“true”不会改变android:focusableInTouchMode,因此只在键盘状态下显示焦点,在TouchMode状态下,依旧无法显示焦点。
    android:focusable=“false”,一定会使android:focusableInTouchMode=“false”。
    android:focusableInTouchMode=“false”,不会影响android:focusable。
    android:focusableInTouchMode=”true”,一定会是android:focusable=“true”

关于Button的Focusable

Button默认不不会获取焦点的,所以我们需要自己去设置focus,这样也会有个问题,如果实在触摸屏上面对一次点击不会相应点击事件,第二次点击才会。

requestFocus

这个方法是让View获取焦点,并且是优先去处理
- 也可以使用requestFocus标签在xml中,让对应的View获取到焦点

<Button
        android:id="@+id/bt"
        android:layout_width="119dp"
        android:layout_height="51dp"
        android:layout_marginLeft="59dp"
        android:layout_marginStart="59dp"
        android:layout_marginTop="77dp"
        android:onClick="bt"
        android:text="Button"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <requestFocus/>
    </Button>

关于descendantFocusability获取焦点问题

可以看看这篇,很简单
http://blog.csdn.net/lylodyf/article/details/52326087

TV项目焦点的处理问题

智能电视也开始慢慢的普及,所以产生了许多需要运行在TV上面的apk,TV是非触屏的,是用遥控器来选择的,关于它的焦点问题正如上面所说的需要用focusable属性,一般的处理方式如下

        button.setFocusable(true);
        button.setOnFocusChangeListener(this);
@Override
    public void onFocusChange(View view, boolean b) {
        if (b) {//当选中这个View时做一些你所需要的操作
            view.setScaleX(1.2f);
            view.setScaleY(1.2f);
        } else {
            view.setScaleX(1.0f);
            view.setScaleY(1.0f);
        }

    }
;