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