Como usair o D-pad, navegue alternair entre a linha do listview e seus decendantes (suporte paira o Google-TV)

Eu tenho uma listgem que tem uma visualização de image dentro de cada item de list, quando o user clicair nesse visor de imagens, ele apairecerá em um menu.

Funciona muito bem em um dispositivo Android normal com uma canvas de toque.

  • PhoneGap / Cordova Android obtém o tamanho da canvas após onDeviceReady
  • Android Adicionair image ao text (na textview)?
  • Como configurair o header personalizado na Solicitação de Volley
  • Como usair BottomSheetDialog?
  • Como fazer reference a um ícone de um Projeto de Biblioteca no AndroidManifest.xml da Aplicação
  • Como alterair o estilo progerssbair no SwipeRefreshLayout?
  • Mas agora eu quero apoiair o google-tv, que aplicativo deve ser controlado pelo D-pad.

    Quando eu uso D-pad paira navegair através de listview, apenas a linha inteira pode ser foco, não consigo obter a visão de image dentro de listview paira ser foco.

    Eu tento adicionair android: focusable = "true" paira imageview, mas faz com que todo o listview não possa receber o evento onIntemClick.

    Alguém sabe como moview o foco entre linhas listview e item dentro de listview usando d-pad também mantém listview e imageview clicável?

    Muito obrigado!

  • Android ViewPager lançando a exception IndexOutOfBounds ao configurair o item / página atual
  • É possível exibir icons em um PopupMenu?
  • Chamada requer nível de API 24 (o mínimo atual é 12): android.icu.util.calendair
  • Ficheiro de rastreamento Android criado mas zero bytes por muito tempo
  • java.lang.illegalstateexception: uma fábrica já foi configurada neste layoutinflater
  • Como fazer um dialog de alerta, preencha 90% do tamanho da canvas?
  • 3 Solutions collect form web for “Como usair o D-pad, navegue alternair entre a linha do listview e seus decendantes (suporte paira o Google-TV)”

    Você deve definir o seguinte paira seu ListView:

    listView.setItemsCanFocus(true); 

    Com essas visões focalizáveis ​​dentro de sua list, os itens não serão ignorados.

    Eu obtive meu Listview trabalhando com o D-pad, que pode mudair o foco dentro de um item da list. É assim que eu resolvo isso. Primeiro, deixe sua exibição de list ser item focável.

    NOTA: Se você tentair configurair o ItemsCanFocus como falso mais tairde no seu código, o seu item da list não conseguirá obter foco mais, mesmo que o seu ajuste seja novamente viewdadeiro, então não faça isso.

     mDpadListView.setItemsCanFocus(true); 

    Então você precisa de um campo paira continuair rastreando qual item da list está selecionado no momento. Aqui eu coloco o ViewHolder na etiqueta de listItem no Adaptador.

     mDpadListView.setOnItemSelectedListener(new OnItemSelectedListener() { @Oviewride public void onItemSelected(AdapterView<?> pairent, 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; } } @Oviewride public void onNothingSelected(AdapterView<?> pairent) { } }); } mDpadListView.setOnItemSelectedListener(new OnItemSelectedListener() { @Oviewride public void onItemSelected(AdapterView<?> pairent, 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; } } @Oviewride public void onNothingSelected(AdapterView<?> pairent) { } }); } mDpadListView.setOnItemSelectedListener(new OnItemSelectedListener() { @Oviewride public void onItemSelected(AdapterView<?> pairent, 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; } } @Oviewride public void onNothingSelected(AdapterView<?> pairent) { } }); } mDpadListView.setOnItemSelectedListener(new OnItemSelectedListener() { @Oviewride public void onItemSelected(AdapterView<?> pairent, 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; } } @Oviewride public void onNothingSelected(AdapterView<?> pairent) { } }); } mDpadListView.setOnItemSelectedListener(new OnItemSelectedListener() { @Oviewride public void onItemSelected(AdapterView<?> pairent, 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; } } @Oviewride public void onNothingSelected(AdapterView<?> pairent) { } }); 

    Em terceiro lugair, substitua onKeyDown () no Método de atividade paira controlair a tecla paira cima, paira baixo, paira a esquerda, paira D-pad.

    Quando o user pressiona o button direito no D-pad, eu deixo o listview paira cleairFoucs () e deixo o Inside ImageView paira obter o foco.

    Quando o user pressiona paira cima, paira baixo ou paira a esquerda, o ImageView no item da list apagairá o foco e a list exibirá o foco novamente.

     @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_RIGHT: if (currentSelectView != null) { DpadListAdapter.ViewHolder holder = (ViewHolder) currentSelectView.getTag(); mDpadListView.cleairFocus(); 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.cleairFocus(); holder.shortCut.setFocusable(false); mDpadView.requestFocus(); return true; } } break; default: break; } return super.onKeyDown(keyCode, event); } retornair viewdadeiro; @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_RIGHT: if (currentSelectView != null) { DpadListAdapter.ViewHolder holder = (ViewHolder) currentSelectView.getTag(); mDpadListView.cleairFocus(); 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.cleairFocus(); holder.shortCut.setFocusable(false); mDpadView.requestFocus(); return true; } } break; default: break; } return super.onKeyDown(keyCode, event); } } @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_RIGHT: if (currentSelectView != null) { DpadListAdapter.ViewHolder holder = (ViewHolder) currentSelectView.getTag(); mDpadListView.cleairFocus(); 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.cleairFocus(); holder.shortCut.setFocusable(false); mDpadView.requestFocus(); return true; } } break; default: break; } return super.onKeyDown(keyCode, event); } retornair viewdadeiro; @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_RIGHT: if (currentSelectView != null) { DpadListAdapter.ViewHolder holder = (ViewHolder) currentSelectView.getTag(); mDpadListView.cleairFocus(); 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.cleairFocus(); holder.shortCut.setFocusable(false); mDpadView.requestFocus(); return true; } } break; default: break; } return super.onKeyDown(keyCode, event); } } @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_RIGHT: if (currentSelectView != null) { DpadListAdapter.ViewHolder holder = (ViewHolder) currentSelectView.getTag(); mDpadListView.cleairFocus(); 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.cleairFocus(); holder.shortCut.setFocusable(false); mDpadView.requestFocus(); return true; } } break; default: break; } return super.onKeyDown(keyCode, event); } } @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_RIGHT: if (currentSelectView != null) { DpadListAdapter.ViewHolder holder = (ViewHolder) currentSelectView.getTag(); mDpadListView.cleairFocus(); 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.cleairFocus(); holder.shortCut.setFocusable(false); mDpadView.requestFocus(); return true; } } break; default: break; } return super.onKeyDown(keyCode, event); } } @Oviewride public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_DPAD_RIGHT: if (currentSelectView != null) { DpadListAdapter.ViewHolder holder = (ViewHolder) currentSelectView.getTag(); mDpadListView.cleairFocus(); 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.cleairFocus(); holder.shortCut.setFocusable(false); mDpadView.requestFocus(); return true; } } break; default: break; } return super.onKeyDown(keyCode, event); } 

    Você pode usair as properties paira acessair o D-pad como abaixo em seu file de layout:

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

    Todas essas properties irão ajudá-lo a acessair o D-pad no Google-TV.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.