adjustPan no evita que el teclado cubra EditText

Intento crear una pantalla de chat bastante básica con un ListView que muestra el texto y un EditText en la parte inferior y un botón “Enviar” a la derecha de EditText. Todo es funcional, pero cuando hago clic en EditText, el teclado virtual lo cubre. La pantalla se mueve un poco, pero no lo suficiente, para hacerse visible sobre el teclado. Tengo la etiqueta “adjustPan” en mi manifiesto y también he probado la etiqueta “adjustResize” en vano. Supongo que tiene algo que ver con la configuración de mi diseño, pero sinceramente no tengo ni idea. ¡Por favor ayuda!

Diseño actual …

     

Después de hacer muchas búsquedas aparentemente es lo que llamo un error. Si usa la etiqueta de pantalla completa (para eliminar la barra de estado de la actividad) no puede usar “adjustResize” sin ajustar la actividad en un ScrollView. Desafortunadamente para mí estoy usando un ListView que crearía otro problema. Estoy harto de jugar con eso y probablemente abandone la pantalla completa de esa actividad.

En su archivo de manifiesto, necesita establecer la propiedad apropiada android:windowSoftInputMode . Este atributo es válido desde API 3.

   

Las opciones son: http://developer.android.com/guide/topics/manifest/activity-element.html#wsoft

  • stateUnspecified El estado del teclado virtual (ya sea que esté oculto o sea visible) no está especificado. El sistema elegirá un estado apropiado o dependerá de la configuración en el tema. Esta es la configuración predeterminada para el comportamiento del teclado virtual.
  • stateUnchanged El teclado virtual se mantiene en cualquier estado, ya sea visible u oculto, cuando la actividad pasa a primer plano.
  • “stateHidden” El teclado virtual se oculta cuando el usuario elige la actividad, es decir, cuando el usuario navega de forma afirmativa hacia la actividad, en lugar de retroceder porque deja otra actividad.
  • stateAlwaysHidden El teclado virtual siempre está oculto cuando la ventana principal de la actividad tiene un foco de entrada.
  • stateVisible El teclado virtual es visible cuando eso normalmente es apropiado (cuando el usuario está navegando hacia la ventana principal de la actividad).
  • stateAlwaysVisible El teclado virtual se hace visible cuando el usuario elige la actividad, es decir, cuando el usuario navega de manera afirmativa hacia la actividad, en lugar de retroceder porque deja otra actividad.
  • adjustUnspecified No se especifica si la ventana principal de la actividad cambia de tamaño para dejar espacio para el teclado virtual , o si el contenido de la ventana se desplaza para hacer que el foco actual sea visible en la pantalla. El sistema seleccionará automáticamente uno de estos modos dependiendo de si el contenido de la ventana tiene alguna vista de diseño que pueda desplazar sus contenidos. Si existe tal vista, la ventana cambiará de tamaño, suponiendo que el desplazamiento puede hacer que todos los contenidos de la ventana sean visibles dentro de un área más pequeña. Esta es la configuración predeterminada para el comportamiento de la ventana principal.
  • adjustResize La ventana principal de la actividad siempre se redimensiona para dejar espacio para el teclado virtual en la pantalla.
  • adjustPan La ventana principal de la actividad no cambia de tamaño para dejar espacio para el teclado virtual . Más bien, el contenido de la ventana se panoramiza automáticamente para que el enfoque actual nunca se oculte por el teclado y los usuarios siempre pueden ver lo que escriben. En general, esto es menos conveniente que cambiar el tamaño, ya que el usuario puede necesitar cerrar el teclado virtual para acceder e interactuar con las partes oscuras de la ventana.

si configuras android:windowSoftInputMode="adjustResize" para una actividad en el manifiesto, entonces ScrollView (u otros ViewGroups colapsables) se contraerá para acomodar el teclado virtual. Pero, si configuras android:windowFullscreen="true" en el tema de la actividad, entonces ScrollView no se reducirá porque se ve obligado a llenar toda la pantalla. Sin embargo, configurar android:fitsSystemWindows="false" en tu tema también hace que adjustResize no funcione

Tuve esto en mi AndroidManifest. Ha causado que adjustPan deje de funcionar correctamente. Quité el bloque de abajo y todo funciona bien de nuevo.

  

Aquí hay una solución que he encontrado. Abra el problemático editText y presione la tecla RETORNO. Observe que desplaza el editText más cerca de la posición que está tomando.

Así que, aunque hacky, básicamente puedes agradar a una nueva línea en la parte superior del texto de edición.

Esto también parece funcionar usando una línea nueva en la parte inferior, pero tendría que usar un retraso para no agregar la nueva línea hasta DESPUÉS de que el teclado suave se haya animado en su posición.

Tenga en cuenta que solo tengo este problema en ciertos teléfonos (DroidX).

 if (android.os.Build.MODEL.equals("DROIDX")) { inputEt.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { String text = inputEt.getText().toString(); text = "\n\n" + text.trim(); inputEt.setText(text); inputEt.setSelection(text.length()); } }); } 

Prueba agregar android:windowSoftInputMode="adjustResize|stateVisible|stateAlwaysHidden" en tu manifiesto.

Puede probar la siguiente configuración: