android tv 遥控器按键的处理(例一)

    开发中遇到的问题整理:

多个RecycleView混排,上下左右按钮的处理:

上图中,遇到的问题:

1. 焦点在EditText时,按下键,焦点直接移动到下方的Recommendations列表中;

2. 焦点在Recommendations列表中时,按上键,焦点有时移动到中间的History列表中,有时移动到clear all按钮上,有时还会移动到上面的EditText中

3. 焦点在搜索历史中时,右移,焦点移不到clear all按钮上

4. 当下方列表没有数据时,在EditText上按下键,也会失去焦点

解决方法:

1 . 从EditText按下键的处理 ,关键是失去焦点的条件的处理:

et_search.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                Log.e(TAG,"et_search   onFocusChange="+hasFocus);
                if(hasFocus){
                    et_search.setBackgroundResource(R.drawable.input_bg_clip);
                    ClipDrawable bgDrawable = (ClipDrawable) et_search.getBackground();
                    bgDrawable.setLevel(3000);
                    search_scroll.smoothScrollTo(0,0);
                }else{
                    et_search.setBackgroundResource(R.drawable.input_bg_clip_normal);
                    ClipDrawable bgDrawable = (ClipDrawable) et_search.getBackground();
                    bgDrawable.setLevel(3000);
                    imm.hideSoftInputFromWindow(et_search.getWindowToken(), 0);
                    //当搜索历史有数据时,搜索历史获取焦点
                    if(rl_history.getVisibility() == View.VISIBLE){
                        list_history.requestFocus();
//                        list_history.setDefaultSelect(0);
                    }
                }
            }
        });

2 . 从推荐列表按上键的处理:

在onKeyDown的上键处理中加了

if(list_searchRecom.hasFocus() && rl_history.getVisibility() == View.VISIBLE){
    Log.e(TAG,"KeyEvent.KEYCODE_DPAD_UP=====111111======");
    list_history.requestFocus();
}

打印信息虽然走了,但list_history.requestFocus();没有起作用。

修改:先定义一个标示位,设为0,在上键处理 中加入

if(list_searchRecom.hasFocus() && rl_history.getVisibility() == View.VISIBLE){
    Log.e(TAG,"KeyEvent.KEYCODE_DPAD_UP=====111111======");
    recommendStats = 1;
}

然后在推荐列表的不选中监听中加入下列代码:setOnItemNoSelectListener在adapter中定义接口,然后在失去焦点的监听中调用。

simpleRecyclerAdapter.setOnItemNoSelectListener(new SimpleRecyclerAdapter.OnItemNoSelectListener() {
    @Override
    public void onItemNoSelect(View view, int position, int bigPosition) {
        Log.e(TAG,"list_searchRecom    onItemNoSelect==="+recommendStats);
        if(recommendStats == 1){
            //因为RecycleView的就近原则,有时焦点可以自己移动到搜索历史上,如果不加(!list_history.hasFocus()判断条件会造成有两个item都显示选中状态,只有在搜索历史没有焦点的时候,才让它强制获取焦点
            if(!list_history.hasFocus()){
                list_history.requestFocus();
            }
            recommendStats = 0;
        }

    }
});

上述修改虽然会让搜索历史获取焦点,但焦点有时在第一项上,有时在别的项上。如果要都跳转到第一项上,需要另外再处理,当焦点跳转到别的项时,先把别的项的选中状态去掉,然后再跳转到第一项上。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值