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);
}
}