用户可以使用遥控器的方向键或者箭头键来远程控制电视。这种类型的控制限制为向上,向下,向左,向右运动。Android框架自动处理布局元素之间的方向导航,通常不需要为应用程序做任何额外的操作。然而,你应该使用方向键来彻底的测试以便发现导航过程中的任何问题。遵循以下规则:
- 用户使用方向键能够浏览到屏幕上的所有控件。
- 通过焦点滚动列表,通过上下键滚动列表,使用“Enter”键可以选中子项。
- 确保控件之间的切换是直接的、可预测的。
为满足上述规则,往往需要自定义导航,如下:
<TextView android:id="@+id/Category1"
android:nextFocusDown="@+id/Category2"\>
nextFoucsDown 按下方向键时,指定下一个获取焦点的视图;
nextFoucsLeft 按左方向键时,指定下一个获取焦点的视图;
nextFoucsRight 按 右方向键时,指定下一个获取焦点的视图;
nextFoucsUp 按上方向键时,指定下一个获取焦点的视图;
对于布局中的多个view我们可以使用上述方式来进行导航,如果存在ViewGroup,我们需要一些额外操作,原理一样。如下:
现在需要通用遥控器使焦点从一个view到达RecyclerView 的某一项。
给RecyclerView中需要导航的项指定id:
public class TabHomeAdapter extends RecyclerView.Adapter {
private Context mContext;
private List<CatgoryData> list;
public TabHomeAdapter(Context mContext, List<CatgoryData> list){
this.mContext=mContext;
this.list=list;
}
private List<Integer> ids = new ArrayList<Integer>() {
{
add(R.id.title_bar1);
add(R.id.title_bar2);
add(R.id.title_bar3);
add(R.id.title_bar4);
add(R.id.title_bar5);
add(R.id.title_bar6);
add(R.id.title_bar7);
add(R.id.title_bar8);
}
};
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view=LayoutInflater.from(mContext).inflate(R.layout.tab_home_item_layout,null);
return new TabHomeHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
final TabHomeHolder tabHomeHolder= (TabHomeHolder) holder;
tabHomeHolder.itemView.setId(ids.get(position));
}
@Override
public int getItemCount() {
return list.size();
}
private static class TabHomeHolder extends RecyclerView.ViewHolder{
private TextView tabName;
public TabHomeHolder(View view){
super(view);
tabName= (TextView) view.findViewById(R.id.tab_name);
}
}
}
在values目录下添加ids.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item type="id" name="title_bar1" />
<item type="id" name="title_bar2" />
<item type="id" name="title_bar3" />
<item type="id" name="title_bar4" />
<item type="id" name="title_bar5" />
<item type="id" name="title_bar6" />
<item type="id" name="title_bar7" />
<item type="id" name="title_bar8" />
</resources>
在通过设置setNextFocusXXX(R.id.title_bar...)使指定项获得焦点。
禁止某个方向的导航操作:
view.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
//禁止向下键,拦截KeyEvent.KEYCODE_DPAD_DOWN
if (keyCode==KeyEvent.KEYCODE_DPAD_DOWN){
return true;
}
return false;
}
});
网友评论