2013-01-18 16 views
9

Mam widok listy, który ma widok obrazu wewnątrz każdego elementu listy, gdy użytkownik kliknie na ten widok, wyświetli menu .Sposób korzystania z D-padu przełączanie między wierszem listy wyświetleń i jej elementami potomnymi (obsługa Google TV)

Działa bardzo dobrze na normalnym urządzeniu z systemem Android z ekranem dotykowym.

Ale teraz chcę wspierać google-tv, która aplikacja powinna być kontrolowana przez D-pada.

Kiedy używam D-pada do nawigacji w widoku listy, można ustawić ostrość tylko na całym wierszu, nie mogę uzyskać podglądu wewnątrz widoku listy.

Próbuję dodać android: focusable = "true" do podglądu obrazu, ale powoduje to, że cały listview nie może otrzymać zdarzenia onItemClick.

Czy ktokolwiek wie, jak przenieść fokus między wierszami widoku listy, a pozycją w widoku listy za pomocą narzędzia d-pad, umożliwia również klikanie listy i widok obrazu?

Wielkie dzięki!

Odpowiedz

2

Mam swoją pracę Listview z D-pad, który może przełączać fokus wewnątrz elementu listy. Tak to rozwiązuję. Po pierwsze, pozwól, aby Twój widok listy był skupiony na pozycji.

UWAGA: Jeśli spróbujesz ustawić ItemsCanFocus na wartość false w kodzie, Twój element listy nie będzie mógł już skupić się, nawet jeśli twój zestaw ponownie ustawi się na true, więc nie rób tego.

mDpadListView.setItemsCanFocus(true); 

Następnie potrzebne jest pole do śledzenia, który element listy jest aktualnie wybrany. Tutaj umieszczam ViewHolder w tagu listItem w 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) { 
    } 
}); 

Po trzecie, przesłonię onKeyDown() w Activity Method, aby kontrolować klawisz w górę, w dół, w lewo, w prawo dla D-pad.

Gdy użytkownik naciśnie prawy przycisk na D-pad, pozwolę, aby listview wyczyściłFoucs() i pozwolił ImageView wewnątrz uzyskać fokus.

Gdy użytkownik naciśnie w górę, w dół lub w lewo, element ImageView na liście usunie jego fokus i listView ponownie uzyska fokus.

@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); 
} 
+0

Witam, potrzebuję pomocy, chcę wiedzieć, jak wybrać element z podkładką d-pad, a następnie zmienić kolor tła. – wdyz

+0

Musisz użyć listy stanów, którą można przeciągnąć na obrazie tła twojego przedmiotu, dać androidowi: state_focused = "true" inny obraz z normalnego stanu. ref: http://developer.android.com/guide/topics/resources/drawable-resource.html#StateList – henry74918

+0

Cześć, co to jest currentSelectView – Andrain

0

Można użyć właściwości dostęp do D-pad jak poniżej w pliku layoutu:

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

Te wszystkie właściwości pomoże Ci uzyskać dostęp do D-pad w Google TV .

+0

ListView i zawartość ListView nie są w tym samym formacie XML, więc nie wiem jak przenieść punkt ciężkości z samej treści do ListView ListView za (jak ImageView lub TextView). – henry74918

6

Musisz ustawić następujące dla ListView:

listView.setItemsCanFocus(true); 

z tym aktywowana poglądów wewnątrz swoich ListItems nie będą ignorowane.

+0

Nie wiem, jak nie widziałem tego w dokumentach, ale działa świetnie.jedyną rzeczą, którą muszę zrobić w moim przypadku, to przesłonić getVerticalFadingEdgeLength, podczas gdy losowy powrót 42 wydaje się go zachowywać. to powoduje, że widok listy jest zawsze wystarczający dla następnego rzędu w dół/w górę dostępnego dla ogniskowania. w przeciwnym razie, jeśli ostatni wiersz jest wyrównany do górnej/dolnej części ekranu, ostrość zostaje zablokowana. – user2399268