我有一个列表视图,在每个列表项中都有一个图像视图,当用户单击该图像视图时,它将弹出一个菜单。
它在带有触摸屏的普通安卓设备上运行得非常好。
但现在我想支持google-tv,哪个应用程序应该由D-pad控制。
当我使用D-pad在listview中导航时,只有整行可以成为焦点,我无法获得listview中的imageview作为焦点。
我尝试将android:focusable="true“添加到imageview,但它导致整个listview无法接收onItemClick事件。
有谁知道如何使用d-pad在listview行和listview内的项之间移动焦点,同时保持listview和imageview可点击?
非常感谢!
发布于 2013-08-22 11:05:35
我用D-pad让我的Listview工作,它可以在列表项中切换焦点。这就是我解决问题的方法。首先,让你的列表视图是可聚焦的。
注意:如果您稍后在代码中尝试将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方法中的onKeyDown()来控制D键盘的up、down、left、right键。
当用户按下D-pad上的右按钮时,我让listview转到clearFoucs(),让里面的ImageView获得焦点。
当用户按up、down或left时,列表项中的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);
}发布于 2013-01-19 12:35:10
您必须为您的ListView设置以下内容:
listView.setItemsCanFocus(true);有了这个,listItems中的可聚焦视图将不会被忽略。
发布于 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。
https://stackoverflow.com/questions/14392356
复制相似问题