首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用D-pad导航在listview的行和它的子行之间切换(Google-TV支持)

如何使用D-pad导航在listview的行和它的子行之间切换(Google-TV支持)
EN

Stack Overflow用户
提问于 2013-01-18 12:23:34
回答 3查看 12.5K关注 0票数 9

我有一个列表视图,在每个列表项中都有一个图像视图,当用户单击该图像视图时,它将弹出一个菜单。

它在带有触摸屏的普通安卓设备上运行得非常好。

但现在我想支持google-tv,哪个应用程序应该由D-pad控制。

当我使用D-pad在listview中导航时,只有整行可以成为焦点,我无法获得listview中的imageview作为焦点。

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

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

非常感谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-22 11:05:35

我用D-pad让我的Listview工作,它可以在列表项中切换焦点。这就是我解决问题的方法。首先,让你的列表视图是可聚焦的。

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

代码语言:javascript
复制
mDpadListView.setItemsCanFocus(true);

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

代码语言:javascript
复制
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方法中的onKeyDown()来控制D键盘的up、down、left、right键。

当用户按下D-pad上的右按钮时,我让listview转到clearFoucs(),让里面的ImageView获得焦点。

当用户按up、down或left时,列表项中的ImageView将清除其焦点,并且listView再次获得焦点。

代码语言:javascript
复制
@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);
}
票数 3
EN

Stack Overflow用户

发布于 2013-01-19 12:35:10

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

代码语言:javascript
复制
listView.setItemsCanFocus(true);

有了这个,listItems中的可聚焦视图将不会被忽略。

票数 8
EN

Stack Overflow用户

发布于 2013-01-18 13:02:53

您可以在布局文件中使用以下属性访问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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14392356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档