关于KeyEvent—焦点的处理

1 篇文章 0 订阅
1 篇文章 0 订阅
这几天在做Android 关于keyevent方面的代码的开发,现在记录一下,以备不时之需。

要求

将原来通过Touch触发的SwitchButton的切换事件的代码,移植到不支持触摸的andorid系统上。所以需要进行从TouchEvent变成KeyEvent。为了尽可能的少改动原来的代码,所以通过在原有的UI框架内加一个自定义Layout 的方法来添加焦点事件。

焦点移动流程:

1.在想要获得焦点的控件上添加属性focusable=“true”,并设置好上一个焦点和下一个焦点,nextFocusUp和nextFocusDown,属性值为控件的Id

<FocusFrameLayout
     android:id="@+id/focus_apr_setting_layout"
     app:enter_response="@+id/apr_setting_switch"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:background="@drawable/strokecolor_focus"
     android:focusable="true"
     android:nextFocusUp="@+id/focus_recovery_log_enable_layout"
     android:nextFocusDown="@+id/focus_upload_crash_info_layout">

2.在Activity中实例化一个焦点控件,并吧页面的第一个焦点给它

focusAprSettinLayout.requestFocus();

3.在通过cmd键入

adb shell input keyevent 20      //下一个
adb shell input keyevent 19      //上一个

4.在android stidio中创建的项目,会有已经设置好的获得焦点时和失去焦点时的样式。或者你也可以去自定义。
先创建一个xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_focused="true" >
        <shape>
            <stroke 
                android:width="1dp"
                android:color="@color/detail_item_color">
            </stroke>
	    <corners 
                android:radius="1dp">
	    </corners>
	    <padding 
                android:bottom="2dp"
                android:top="2dp"
                android:left="2dp"
                android:right="2dp"
            >
	    </padding>
        </shape>
    </item>
</selector>

在item中的android:state_focused是系统自带的属性,如果后面是true,意为当获得焦点的时候。然后在shape中添加样式,stroke为边框,就是当该控件获得焦点时边框宽度变为1dp,颜色为某种颜色,其他属性也可以自己去添加。
最后在控件中把背景属性设置为这个xml

Enter流程:

1.cmd键入指令adb shell input keyevent 66(为enter命令)
2.当前焦点所在的自定义FocusFrameLayout控件中的dispatchkeyevent()接收到该命令,但是需要enter的控件包含在FocusFrameLayout中,如何来获取某一个控件中的在控件名呢?所以需要在FocusFrameLayout中添加一个自定义属性用来传递内部的控件名。

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <declare-styleable name="FocusFrameLayout">
        <attr name="enter_response" format="reference">
        </attr>
    </declare-styleable>

</resources>

然后在FocusFrameLayout的属性里添加

app:enter_response="@+id/apr_setting_switch"

接下来,在FocusFrameLayout中的构造函数中来获取

public FocusFrameLayout (Context context, AttrbuteSet attr) {
TypeArray ta = context.ObtinStyleableAttribute(attr, R.styleable.focusframelayout);
int mResponseId = ta.getResouseId(R.styleable.focusframelayout.enter_response, 0);
}

3.然后在自定义的FocusFrameLayout中重写dispatchkeyevent()方法,在其中进行判断并执行相应命令

 @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        if(event.getKeyCode() == KeyEvent.KEYCODE_ENTER && event.getAction() != KeyEvent.ACTION_UP) {

            mReaponseld.performclick();
           return true;
        }
        return super.dispatchKeyEvent(event);
    }

2.Click指令在Activity中监听并作出反应

@Override
public void onClick(View v){

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值