Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何使用D-pad导航在listview的行和Decentants之间切换(谷歌电视支持)_Android_Android Listview_Google Tv - Fatal编程技术网

Android 如何使用D-pad导航在listview的行和Decentants之间切换(谷歌电视支持)

Android 如何使用D-pad导航在listview的行和Decentants之间切换(谷歌电视支持),android,android-listview,google-tv,Android,Android Listview,Google Tv,我有一个listview,每个列表项中都有一个imageview,当用户单击该imageview时,它会弹出一个菜单 它在带有触摸屏的普通安卓设备上运行良好 但现在我想支持谷歌电视,哪个应用程序应该由D-pad控制 当我使用D-pad在listview中导航时,只有整行可以聚焦,而listview中的imageview无法聚焦 我尝试将android:focusable=true添加到imageview,但这会导致整个listview无法接收onItemClick事件 是否有人知道如何使用d-p

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

它在带有触摸屏的普通安卓设备上运行良好

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

当我使用D-pad在listview中导航时,只有整行可以聚焦,而listview中的imageview无法聚焦

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

是否有人知道如何使用d-pad在listview行和listview内的项目之间移动焦点,同时保持listview和imageview的可点击性


非常感谢

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


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

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

listView.setItemsCanFocus(true);

有了它,列表项中的可聚焦视图将不会被忽略。

我的Listview使用了D-pad,它可以在列表项中切换焦点。 我就是这样解决的。 首先,让您的列表视图可聚焦于项

注意:如果您稍后在代码中将ItemsCanFocus设置为false,您将发现列表项无法再获得焦点,即使您再次将其设置为true,也不要这样做

mDpadListView.setItemsCanFocus(true);
然后需要一个字段来跟踪当前选择的列表项。 在这里,我将ViewHolder放在适配器中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) {
    }
});

listview和listview的内容不在同一个xml中,因此我不知道如何将焦点从listview本身移动到listview的内容中,如imageview或textview。您好,我需要帮助,我想知道如果我使用d-pad选择一个项目,那么背景颜色如何变化。您需要使用可在项目背景图像上绘制的状态列表,给android:state_focused=true一个与正常状态不同的图像。ref:Hi,what is CurrentSelectView CurrentSelectView是适配器提供的应用程序当前关注的视图。如果您当前关注的是listview的第二项,则该视图包含的第二项是currentSelectView。我不知道为什么我在文档中没有看到该项,但它工作得很好。在我的例子中,我唯一要做的另一件事是重写getVerticalFadingEdgeLength,而随机返回42似乎可以让它正常工作。这会使列表视图始终有足够的下一行向下/向上可用于聚焦。否则,如果最后一行正好与屏幕的顶部/底部对齐,则焦点会被卡住。
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) {
    }
});
@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);
}