Las pestañas TabHost de Android roban el enfoque al utilizar el teclado de hardware

Actualmente tengo un TabHost contiene 4 pestañas. En algunos de los fragmentos tenemos un número de vistas de EditText dentro del diseño.

Hemos notado que cuando se intenta escribir en cualquiera de las vistas EditText utilizando el teclado de hardware, el foco se robó de la EditText y se le da a la pestaña actualmente activa en el TabHost . Esto sólo ocurre en pantallas con pestañas. ¿Hay una manera rápida y simple de solucionar esto?

Este ha sido un error conocido desde hace mucho tiempo:

http://code.google.com/p/android/issues/detail?id=2516

Una solución sería obligar a TabHost a perder el foco después de seleccionar una pestaña. Esto se hace estableciendo un OnTabChangeListener para el TabHost y llamando a clearFocus en el método onTabChanged .

 tabHost.setOnTabChangedListener(new OnTabChangeListener(){ public void onTabChanged(String tabID) { tabHost.clearFocus(); } }); 

EDIT: Si esto no funciona, puede probar al revés. Forzando los campos EditText para ganar foco en su lugar:

 OnTouchListener focusHandler = new OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent event) { // TODO Auto-generated method stub view.requestFocusFromTouch(); return false; } }; editText.setOnTouchListener(focusHandler); //For each EditText with this issue 

He encontrado esta solución en http://code.google.com/p/android/issues/detail?id=2516 y funciona mejor que cualquiera de las soluciones aquí o en la página de informes de errores, ya que se ocupa de la causa raíz en su lugar De trabajar a su alrededor. Dejaré que el autor (g1adrift) explique:

TabHost registra un OnTouchModeChangeListener en onAttachedToWindow () que roba el foco al salir del modo táctil (aka cuando alguien presiona una tecla) si la vista del contenido de la pestaña actual no tiene foco. Si bien esto puede tener sentido si todo el diseño es tabulado, si sólo hay una parte del diseño que tiene pestañas, que causa problemas.

Esta solución elimina ese oyente, por lo que todos los artefactos de su uso deben desaparecer:

En onCreate (), agregue:

 TabHost mTabHost = (TabHost) findViewById(android.R.id.tabhost); mTabHost.addOnAttachStateChangeListener(new OnAttachStateChangeListener() { @Override public void onViewDetachedFromWindow(View v) {} @Override public void onViewAttachedToWindow(View v) { mTabHost.getViewTreeObserver().removeOnTouchModeChangeListener(mTabHost); } }); 

Se supone que sólo funciona para SDK 12 +. El autor también publicó una solución para SDK anteriores. Si lo necesita, haga clic en el enlace de arriba y busque los mensajes de "g1adrift".

  @Override public void onPageSelected(int position) { // Unfortunately when TabHost changes the current tab, it kindly // also takes care of putting focus on it when not in touch mode. // The jerk. // This hack tries to prevent this from pulling focus out of our // ViewPager. TabWidget widget = mTabHost.getTabWidget(); int oldFocusability = widget.getDescendantFocusability(); widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS); mTabHost.setCurrentTab(position); widget.setDescendantFocusability(oldFocusability); } 

Copiar y pegar desde los ejemplos de la biblioteca de soporte de Android

  • OnKeyDown en un servicio? (Teclas directas globales)
  • Desvío del teclado Android
  • ¿Cómo puedo detectar si el teclado del software es visible en el dispositivo Android?
  • Eclipse Android Emulator - Teclado no funciona
  • Campo de texto en WebView en un Android está oculto por el teclado
  • Utilice la tecla "ENTER" en el teclado en lugar de hacer clic en el botón
  • Cómo abrir el teclado Android "123"
  • El teclado virtual de Android nunca aparece en el emulador
  • Ocultar ImageView cuando aparezca el teclado y mostrarlo cuando desaparezca el teclado
  • Ocultar teclado virtual al hacer clic en un botón
  • Mostrar emoticonos personalizados en el teclado de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.