2012-05-06 19 views
7

Moja aplikacja ma numer ListView i EditText znajdujący się poniżej. Z jakiegoś powodu klawisz TAB nie wyzwala onKeyListener. Wszystkie pozostałe klawisze, którymi się zajmuję (DEL, ENTER, DPAD_UP/DOWN/CENTER) są odbierane poprawnie. Dodałem punkt przerwania w dispatchKeyEvent, znowu nie ma szczęścia otrzymującego zdarzenia TAB.EditText nie odbiera zdarzeń klawiszy TAB - zdjęcie miękkie vk

Moja aplikacja poprzednio miała duży TextView do wyświetlania tekstu i w tym czasie zdarzenia TAB zostały odebrane poprawnie. Model ListView zastąpił teraz TextView.

Jestem całkowicie zdumiony, dlaczego wydarzenie TAB nie jest już odbierane. To jest na stanie Xoom, z uruchomionym ICS 4.0.4 & stock N1, z 2.3.6.

Porównałem mój obecny kod z wersją przy użyciu TextView, a znaczna część kodu służy tylko do obsługi ListView w miejsce TextView. Oprócz atrybutów nextFocusLeft i nextFocusRight nic się nie zmieniło w EditText.

Edycja: Próbowałem tylko z klawiaturą Go i klawiaturą hakerską, a TAB jest odbierany dobrze. Wygląda na to, że dzieje się tak tylko z niektórymi wirtualnymi klawiaturami:

Odpowiedz

0

Myślę, że mogę zobaczyć problem. Patrząc na źródło ListView.java, istnieje mechanizm konsumowania kluczowych zdarzeń, które zmieniają fokus w elemencie listy. Sprawdź komentarze poprzedzające tę metodę, a także blok komentarzy w środku metody.

/** 
* To avoid horizontal focus searches changing the selected item, we 
* manually focus search within the selected item (as applicable), and 
* prevent focus from jumping to something within another item. 
* @param direction one of {View.FOCUS_LEFT, View.FOCUS_RIGHT} 
* @return Whether this consumes the key event. 
*/ 
private boolean handleHorizontalFocusWithinListItem(int direction) { 
    if (direction != View.FOCUS_LEFT && direction != View.FOCUS_RIGHT) { 
     throw new IllegalArgumentException("direction must be one of" 
       + " {View.FOCUS_LEFT, View.FOCUS_RIGHT}"); 
    } 

    final int numChildren = getChildCount(); 
    if (mItemsCanFocus && numChildren > 0 && mSelectedPosition != INVALID_POSITION) { 
     final View selectedView = getSelectedView(); 
     if (selectedView != null && selectedView.hasFocus() && 
       selectedView instanceof ViewGroup) { 

      final View currentFocus = selectedView.findFocus(); 
      final View nextFocus = FocusFinder.getInstance().findNextFocus(
        (ViewGroup) selectedView, currentFocus, direction); 
      if (nextFocus != null) { 
       // do the math to get interesting rect in next focus' coordinates 
       currentFocus.getFocusedRect(mTempRect); 
       offsetDescendantRectToMyCoords(currentFocus, mTempRect); 
       offsetRectIntoDescendantCoords(nextFocus, mTempRect); 
       if (nextFocus.requestFocus(direction, mTempRect)) { 
        return true; 
       } 
      } 
      // we are blocking the key from being handled (by returning true) 
      // if the global result is going to be some other view within this 
      // list. this is to acheive the overall goal of having 
      // horizontal d-pad navigation remain in the current item. 
      final View globalNextFocus = FocusFinder.getInstance().findNextFocus(
        (ViewGroup) getRootView(), currentFocus, direction); 
      if (globalNextFocus != null) { 
       return isViewAncestorOf(globalNextFocus, this); 
      } 
     } 
    } 
    return false; 
} 

Czy w elemencie z pojedynczą listą znajduje się wiele elementów możliwych do ustawienia? Jeśli tak, ten kod zużyje klawisz tabulatora. W takim przypadku możesz chcieć uczynić niektóre elementy nierozbieralnymi lub rozważyć inną opcję projektu.

+0

Przygotowałem projekt testowy do przetestowania tego i niestety to nie zadziałało. Edittext zawsze ma fokus, więc zawsze powinien otrzymać klucz główny, lub przynajmniej powinien zostać schwytany w dispatchKeyEvent. Działa to dobrze z klawiaturą Hackers, ale nie z wersji podstawowej. Przesłałem tutaj testowy projekt http://dl.dropbox.com/u/78755665/Test.zip Wszystko jest ustawione na nieogniskowanie w widoku listy –

+0

Sprawdziłem dwukrotnie, zdecydowanie jest to właściwy plik. –

+0

Po uruchomieniu na moim Samsung Galaxy SII Epic 4G, klawiatura nie pokazuje nawet klawisza tabulatora. –

Powiązane problemy