我有一个listview,每个列表项中都有一个imageview,当用户点击该imageview时,它会弹出一个菜单。
在带触摸屏的普通Android设备上运行良好。
但现在我想支持谷歌电视,应用程序应该由D-pad控制。
当我使用D-pad浏览列表视图时,只有整行可以聚焦,我无法将listview内的imageview作为焦点。
我尝试将android:focusable =“true”添加到imageview,但这会导致整个listview无法接收onItemClick事件。
有没有人知道如何使用d-pad在listview行和listview中的项目之间移动焦点还可以保持listview和imageview可点击?
非常感谢!
答案 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。