焦点导航(三)

用户可以使用遥控器的方向键或者箭头键来远程控制电视。这种类型的控制限制为向上,向下,向左,向右运动。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;
        }
    });
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值