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?
- ¿Cómo saber si el teclado (dis) aparece en Android?
- Edittext.settext () cambia el tipo de teclado a predeterminado
- ¿Cómo usar "adjustResize" para ajustar la vista en Android usando phonegap?
- Android popupwindow está por encima del teclado virtual
- Teclado sobre EditText en segundo clic
- SearchView gana el foco y abre el teclado cuando regresa de otra actividad
- ¿Cómo se muestra el teclado numérico en un EditText en android?
- Android mover la disposición hasta cuando el teclado suave se muestra con viewpagers
- ¿Cómo abrir sólo medio teclado en modo horizontal?
- no puede seleccionar la palabra china cuando está en modo horizontal usando la entrada de google de android
- Simulando exactamente la pulsación de teclas de un usuario en Javascript
- AutoCompleteTextView: quita el teclado suave en la parte posterior de la prensa en lugar de sugerencias
- El teclado en pantalla se abre automáticamente cuando se inicia la actividad
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
- Barra de progreso de giro en cada elemento de vista de lista
- Google Play muestra el permiso implícito READ_EXTERNAL_STORAGE