hen*_*918 9 android google-tv android-listview
我有一个listview,每个列表项中都有一个imageview,当用户点击该imageview时,它会弹出一个菜单.
它在带触摸屏的普通Android设备上运行良好.
但现在我想支持谷歌电视,哪个应用程序应该由D-pad控制.
当我使用D-pad在listview中导航时,只有整行可以聚焦,我无法将listview内的imageview作为焦点.
我尝试将android:focusable ="true"添加到imageview,但它导致整个listview无法接收onItemClick事件.
有没有人知道如何使用d-pad在listview行和listview中的项目之间移动焦点还可以保持listview和imageview可点击?
非常感谢!
小智 7
您必须为ListView设置以下内容:
listView.setItemsCanFocus(true);
Run Code Online (Sandbox Code Playgroud)
使用listItems中的可聚焦视图不会被忽略.
我的列表视图与方向键一起使用,它可以在列表项内切换焦点。我就是这样解决的。首先,让您的列表视图具有项目焦点。
注意:如果您稍后在代码中尝试将 ItemsCanFocus 设置为 false,您会发现即使您再次设置回 true,列表项也无法再获得焦点,所以不要这样做。
mDpadListView.setItemsCanFocus(true);
Run Code Online (Sandbox Code Playgroud)
然后,您需要一个字段来跟踪当前选择的列表项。这里我将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) {
}
});
Run Code Online (Sandbox Code Playgroud)
第三,重写 Activity 方法中的 onKeyDown() 来控制 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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10620 次 |
| 最近记录: |