关于focusableInTouchMode不生效的问题

focusableInTouchMode

    对于一个拥有触摸屏功能的设备而言, 一旦用户用手点击屏幕, 设备会立刻进入touch mode。这时候被点击的控件只有isFocusableInTouchMode()为true的时候才会获得focus,比如EditText控件。
    其他可以触摸的控件比如Button(其isFocusableInTouchMode默认为false), 当被点击的时候不会获取焦点,它们只是简单地执行onClick事件而已。

Android touch mode和focusableInTouchMode分析

focusableInTouchMode是指在touch mode(可以通过调用view.isInTouchMode()查看,一般手机都是true,TV是false)下点击也能获取到焦点。

问题:

我是想TV的应用在平板上也可以操作,所以设置了focusableInTouchMode这个属性,但是设置后发现没有效果,点击并不会让View获取到焦点。

设置了

android:focusable="true"
android:focusableInTouchMode="true"

在点击时也还是不会移动焦点。

解决方案

首先保证view.isInTouchMode()是true.

其次断点系统源码查看事件分发流程,发现是因为在分发事件中:

        if (clickable || (viewFlags & TOOLTIP) == TOOLTIP) {
            switch (action) {
                case MotionEvent.ACTION_UP:
                    ...
                        if (isFocusable() && isFocusableInTouchMode() && !isFocused()) {
                            focusTaken = requestFocus();
                        }
            return true;
        }
        return false;

如果不可点击,直接就不会消费事件更别说获取焦点(获取焦点在ACTION_UP中)了。

所以原因就是没有设置可点击(因为应用主要是在TV上,所以事件基本都是在FocusChange上面,并没有设置点击事件)。

加上android:clickable=“true”,或者给view设置一个点击事件就行了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值