Как использовать переключатель перехода D-pad между строкой listview и ее подделками (поддержка Google TV)

У меня есть listview, у которого есть изображение в каждом элементе списка, когда пользователь нажимает на это изображение, он выдает всплывающее меню.

Он отлично работает на обычном устройстве Android с сенсорным экраном.

Но теперь я хочу поддерживать google-tv, какое приложение должно контролировать D-pad.

Когда я использую D-pad для навигации по списку, только целая строка может быть фокусом, я не могу получить фокус изображения внутри списка.

Я пытаюсь добавить android: focusable = "true" в imageview, но это приводит к тому, что весь список не может получить событие onItemClick.

Кто-нибудь знает, как перемещать фокус между строками listview и элементом внутри списка, используя d-pad, также поддерживает просмотр в режиме просмотра и просмотра изображений?

Большое спасибо!

Вы должны установить для ListView следующее:

listView.setItemsCanFocus(true); 

Поскольку эти фокусные представления внутри вашего списка, элементы не будут игнорироваться.

Я получил свою работу Listview с D-pad, которая может переключать фокус внутри элемента списка. Вот как я его решаю. Во-первых, пусть ваш просмотр списка является предметом фокусировки.

ПРИМЕЧАНИЕ. Если вы попытаетесь установить ItemCanFocus в false позже в своем коде, ваш поиск будет невозможен, даже если ваш набор снова вернется в true, поэтому не делайте этого.

 mDpadListView.setItemsCanFocus(true); 

Затем вам нужно поле, чтобы отслеживать, какой элемент списка выбран в текущий момент. Здесь я помещаю ViewHolder в тег listItem в Adapter.

 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) { } }); 

В-третьих, переопределите onKeyDown () в методе активности для управления клавишами «Вверх», «Вниз», «Влево», «Вправо» для D-pad.

Когда пользователь нажимает правую кнопку на D-pad, я разрешаю списку clearFoucs () и позволяю 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); } 

Вы можете использовать свойства для доступа к D-pad, как показано ниже в вашем файле макета:

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

Все эти свойства помогут вам получить доступ к D-pad в Google-TV.