如何在listview行及其后代之间使用D-pad导航切换(Google-TV支持)

时间:2013-01-18 04:23:34

标签: android android-listview google-tv

我有一个listview,每个列表项中都有一个imageview,当用户点击该imageview时,它会弹出一个菜单。

在带触摸屏的普通Android设备上运行良好。

但现在我想支持谷歌电视,应用程序应该由D-pad控制。

当我使用D-pad浏览列表视图时,只有整行可以聚焦,我无法将listview内的imageview作为焦点。

我尝试将android:focusable =“true”添加到imageview,但这会导致整个listview无法接收onItemClick事件。

有没有人知道如何使用d-pad在listview行和listview中的项目之间移动焦点还可以保持listview和imageview可点击?

非常感谢!

3 个答案:

答案 0 :(得分:7)

您必须为ListView设置以下内容:

listView.setItemsCanFocus(true);

使用listItems中的可聚焦视图不会被忽略。

答案 1 :(得分:3)

我的Listview使用D-pad工作,它可以将焦点切换到列表项中。 这就是我解决它的方法。 首先,让列表视图为项目焦点。

注意:如果您稍后在代码中尝试将ItemsCanFocus设置为false,那么即使您再次设置为true,您的列表项也无法获得焦点,所以不要这样做。

mDpadListView.setItemsCanFocus(true);

然后,您需要一个字段来跟踪当前选择的列表项。 在这里,我将ViewHolder放在Adapter中的listItem标签中。

mDpadListView.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view,
            int position, long id) {
        if (view.getTag() != null) {
            DpadListAdapter.ViewHolder holder = (ViewHolder) view.getTag();
            if (holder.shortCut != null && holder.shortCut.isShown()) {
                currentSelectView = view;
            } else {
                currentSelectView = null;
            }
        } else {
            currentSelectView = null;
        }
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {
    }
});

第三,在Activity Method中覆盖onKeyDown()来控制D-pad的向上,向下,向左,向右键。

当用户按下D-pad上的右键时,我让listview清除.Foucs()并让里面的ImageView获得焦点。

当用户向上,向下或向左按下时,列表项中的ImageView将清除它的焦点,listView将再次获得焦点。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    switch (keyCode) {
    case KeyEvent.KEYCODE_DPAD_RIGHT:
        if (currentSelectView != null) {
            DpadListAdapter.ViewHolder holder = 
                (ViewHolder)      currentSelectView.getTag();
            mDpadListView.clearFocus();
            holder.shortCut.setFocusable(true);
            holder.shortCut.requestFocus();
            return true;
        }
        break;
    case KeyEvent.KEYCODE_DPAD_LEFT:
    case KeyEvent.KEYCODE_DPAD_UP:
    case KeyEvent.KEYCODE_DPAD_DOWN:
        if (currentSelectView != null) {
            DpadListAdapter.ViewHolder holder = 
                    (ViewHolder) currentSelectView.getTag();
            if (holder.shortCut.hasFocus()) {
                holder.shortCut.clearFocus();
                holder.shortCut.setFocusable(false);
                mDpadView.requestFocus();
                return true;
            }
        }
        break;
    default:
        break;
    }
    return super.onKeyDown(keyCode, event);
}

答案 2 :(得分:0)

您可以使用属性访问布局文件中的D-pad,如下所示:

        android:nextFocusLeft="@+id/abc"
        android:nextFocusRight="@+id/xyz"
        android:nextFocusUp="@+id/pqr"
        android:nextFocusDown="@+id/mno"
        android:nextFocusForward="@+id/finish"

此所有属性都可以帮助您访问Google-TV中的D-pad。