Android 如何使用D-pad导航在listview的行和Decentants之间切换(谷歌电视支持)
我有一个listview,每个列表项中都有一个imageview,当用户单击该imageview时,它会弹出一个菜单 它在带有触摸屏的普通安卓设备上运行良好 但现在我想支持谷歌电视,哪个应用程序应该由D-pad控制 当我使用D-pad在listview中导航时,只有整行可以聚焦,而listview中的imageview无法聚焦 我尝试将android:focusable=true添加到imageview,但这会导致整个listview无法接收onItemClick事件 是否有人知道如何使用d-pad在listview行和listview内的项目之间移动焦点,同时保持listview和imageview的可点击性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
非常感谢 您可以使用属性访问布局文件中的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);
}