9

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

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

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

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

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

有谁知道如何使用 d-pad 在列表视图行和列表视图内的项目之间移动焦点也保持列表视图和图像视图可点击?

非常感谢!

4

3 回答 3

8

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

listView.setItemsCanFocus(true);

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

于 2013-01-19T04:35:10.153 回答
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 上按下右键时,我让列表视图 clearFoucs() 并让里面的 ImageView 获得焦点。

当用户按下向上、向下或向左时,列表项中的 ImageView 将清除其焦点,列表视图会再次获得焦点。

@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);
}
于 2013-08-22T03:05:34.793 回答
0

您可以在布局文件中使用属性访问方向键,如下所示:

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

所有这些属性将帮助您访问 Google-TV 中的方向键。

于 2013-01-18T05:02:52.927 回答