2012-05-06 14 views
7

Mi aplicación tiene un ListView y un EditText sentado debajo. Por algún motivo, la tecla TAB no activa el onKeyListener. Todas las demás teclas que estoy manejando (DEL, ENTER, DPAD_UP/DOWN/CENTER) se reciben muy bien. Agregué un punto de interrupción en dispatchKeyEvent, de nuevo no tuve suerte para recibir eventos TAB.EditText no recibe eventos clave TAB - stock soft vk

Mi aplicación tenía una gran TextView para mostrar texto y durante este tiempo, los eventos de TAB se recibieron bien. El ListView ahora ha reemplazado el TextView.

Estoy completamente desconcertado de por qué el evento TAB ya no se está recibiendo. Esto está en un stock Xoom, ejecutando ICS 4.0.4 & stock N1, con 2.3.6.

He comparado mi código actual con la versión usando un TextView y gran parte del código es solo para manejar el ListView en el lugar del TextView. Además de los atributos nextFocusLeft y nextFocusRight, nada más ha cambiado para EditText.

Editar: Acabo de probar con Go Keyboard y Hacker's Keyboard y TAB se recibió bien. Parece que esto es solo con algunos teclados virtuales

Respuesta

0

Creo que puedo ver el problema. En cuanto a la fuente de ListView.java, hay un mecanismo para consumir eventos clave que cambian el foco dentro de un elemento de la lista. Consulte los comentarios que preceden a este método, así como el bloque de comentarios en el medio del método.

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

¿Hay múltiples elementos enfocables dentro de un solo elemento de lista? Si es así, este código consumirá la tecla de tabulación. Si ese es el caso, es posible que desee hacer que algunos de los elementos no se puedan enfocar o considerar otra opción de diseño.

+0

Configuré un proyecto de prueba para probar esto y desafortunadamente no funcionó. El texto de edición siempre tiene foco por lo que siempre debe recibir el keyevent, o al menos, debe capturarse en dispatchKeyEvent. Esto funciona bien con Hackers Keyboard pero no con stock. He subido el proyecto de prueba aquí http://dl.dropbox.com/u/78755665/Test.zip Todo está configurado para que no se pueda enfocar en la vista de lista –

+0

Comprobé dos veces, definitivamente es el archivo correcto. –

+0

Cuando lo ejecuto en mi Samsung Galaxy SII Epic 4G, el teclado suave ni siquiera muestra una tecla de tabulación. –

Cuestiones relacionadas