2012-05-06 6 views
7

La mia app ha uno ListView e uno EditText seduto sotto di esso. Per qualche motivo, il tasto TAB non attiva lo onKeyListener. Tutti gli altri tasti che sto gestendo (DEL, ENTER, DPAD_UP/DOWN/CENTER) vengono ricevuti correttamente. Ho aggiunto un punto di interruzione nel dispatchKeyEvent, ancora nessuna fortuna a ricevere eventi TAB.EditText non riceve gli eventi del tasto TAB - stock soft vk

La mia app in precedenza aveva un grande TextView per la visualizzazione del testo e durante questo periodo, gli eventi TAB sono stati ricevuti correttamente. Lo ListView ha ora sostituito lo TextView.

Sono completamente disorientato sul motivo per cui l'evento TAB non viene più ricevuto. Questo è in un magazzino Xoom, con ICS 4.0.4 & stock N1, con 2.3.6.

Ho confrontato il mio codice attuale con la versione utilizzando uno TextView e gran parte del codice è solo per gestire lo ListView al posto dello TextView. Oltre agli attributi nextFocusLeft e nextFocusRight, non è cambiato nient'altro per EditText.

Modifica: ho appena provato con Go Keyboard e la tastiera e il TAB di Hacker sono stati ricevuti correttamente. Sembra che questo sia solo con alcune tastiere virtuali

risposta

0

Penso che potrei vedere il problema. Osservando la fonte per ListView.java, esiste un meccanismo per consumare eventi chiave che spostano l'attenzione all'interno di una voce di elenco. Controlla i commenti che precedono questo metodo e il blocco di commenti nel mezzo del metodo.

/** 
* 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; 
} 

Sono presenti più elementi focalizzabili all'interno di un singolo elemento di elenco? Se è così, questo codice consumerà il tasto tab. Se questo è il caso, allora potresti voler rendere alcuni elementi non focalizzabili o considerare un'altra opzione di design.

+0

Ho impostato un progetto di prova per testarlo e sfortunatamente non ha funzionato. L'edittext ha sempre il focus quindi dovrebbe sempre ricevere il keyevent o, per lo meno, dovrebbe essere catturato in dispatchKeyEvent. Funziona bene con la tastiera degli hacker ma non quella originale. Ho caricato il progetto di test qui http://dl.dropbox.com/u/78755665/Test.zip Tutto è impostato per essere non focalizzabile nella listview –

+0

Ho controllato due volte, è sicuramente il file giusto. –

+0

Quando lo eseguo sul mio Samsung Galaxy SII Epic 4G, la tastiera virtuale non mostra nemmeno un tasto di tabulazione. –

Problemi correlati