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

    }
  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 中,焦点移动可以通过以下几种方式实现: 1. 通过代码设置焦点:可以通过调用 View 的 requestFocus() 方法来设置焦点,例如: ``` EditText editText = findViewById(R.id.editText); editText.requestFocus(); ``` 2. 通过 XML 属性设置焦点:可以在 XML 文件中使用 android:focusableandroid:focusableInTouchMode 属性来设置 View 是否可获得焦点,例如: ``` <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:focusable="true" android:focusableInTouchMode="true" /> ``` 3. 通过监听器处理焦点:可以通过设置 View 的 OnFocusChangeListener 来监听焦点变化事件,例如: ``` editText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { // 处理获取焦点事件 } else { // 处理失去焦点事件 } } }); ``` 4. 通过键盘事件处理焦点:可以在处理键盘事件时,根据当前焦点 View 的 ID 或位置,计算出下一个需要获得焦点的 View,并调用其 requestFocus() 方法来设置焦点,例如: ``` editText.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() == KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_ENTER) { View nextView = v.focusSearch(View.FOCUS_DOWN); if (nextView != null) { nextView.requestFocus(); return true; } } return false; } }); ``` 以上是几种常见的焦点移动方式,可以根据自己的需求选择合适的方式来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值