Android: ¿Cómo evito que el teclado virtual suba mi vista?

386

Tengo un cajón deslizante vertical en la parte inferior de mi aplicación. Cuando se abre el teclado virtual, empuja la pestaña del cajón hacia arriba, por lo que se asienta sobre el teclado. De hecho, quiero que permanezca en la parte inferior de la pantalla, ocultándose cuando se muestra el teclado.

Alguien mas se encuentra con este problema? ¿Sabes cómo arreglarlo?

Christopher Perry
fuente
1
hola, estoy teniendo el mismo problema con la bandera que has usado en el archivo de manifiesto, ¿puedes ayudarme con eso?
Nixit Patel
1
Esta pregunta está duplicada aquí: stackoverflow.com/questions/5516216/…
WonderWorker

Respuestas:

656

Simplemente puede cambiar el windowSoftInputModeindicador de su Actividad adjustPanen su AndroidMainfest.xmlarchivo dentro de su etiqueta de actividad.

Consulte la documentación oficial para más información.

<activity
   ...
   android:windowSoftInputMode="adjustPan"> 
</activity>
Alexander Oleynikov
fuente
43
No quiero que la vista se desplace, quiero que permanezca estática donde está, y solo que el teclado cubra lo que sea que cubra.
Christopher Perry
55
Al hacer una panorámica, significa que la vista se desplazará para hacer visible la vista en la que está escribiendo. En otras palabras, si solo apareciera el teclado no cubría la vista enfocada, permanecerá estática.
Alexander Oleynikov
18
Estoy enfrentando el mismo problema. hizo que el indicador windowSoftInputMode "ajustePan" en el archivo manifeast. pero no funciona. cómo resolverlo
Subrat
20
No ayuda en mi caso tener una fila de botones en la parte inferior de la pantalla y un ScrollView encima de ellos. Los botones se presionan sin importar el valor que tenga en windowSoftInputMode.
Artem Russakovskii
3
No funciona en un fragmento. ¿Cómo hacerlo en fragmento?
Prashanth Debbadwar
175

Ninguna de las respuestas funcionó para mí, pero esto funcionó:

android:windowSoftInputMode="adjustNothing"
Daniel Douglas
fuente
66
Esto hace que el teclado aparezca superpuesto de contenido, sin hacer que el diseño vuelva a calcular su altura.
Reinherd
13
Esto resuelve el problema de que el teclado empuja el contenido hacia arriba, que es lo que yo y el OP queríamos lograr.
Daniel Douglas
8
Préstamo de @Dom que puede usar getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);para establecer este valor mediante programación
Bron Davies
1
Este sí funciona para mí, a diferencia de otras respuestas (jelly bean 4.1)
Virus721
¡Perfecto! También está funcionando en mi caso. Estoy mostrando un cuadro de diálogo que tiene un texto de edición dentro. Tan pronto como se abre el cuadro de diálogo, el teclado también aparecía. Intenté "ajustarPan", pero bloqueó la función de aparición del teclado. Entonces, "ajustarNada" funcionó mejor en mi caso.
sembozdemir
85

En mi caso, la razón por la que se presionaron los botones fue porque la vista sobre ellos era una ScrollView, y se colapsó con los botones presionados hacia arriba sobre el teclado sin importar el valor android:windowSoftInputModeque estaba configurando.

Pude evitar que mi fila inferior de botones fuera presionada por el teclado suave al configurar android:isScrollContainer="false"el ScrollViewque se encuentra sobre los botones.

Artem Russakovskii
fuente
2
Pero en este caso, el teclado virtual cubre parte de la pantalla y no hay forma de desplazarse hacia abajo. Parece que solo hay una forma de evitar que el panel inferior aparezca en la parte superior del teclado, ocultándolo cuando el teclado está abierto ...
Dmitry
1
¡eso es todo! En mi opinión, esta configuración es muy interesante de comentar, ¡ya que es la única forma en que he encontrado para lograr los efectos de la propiedad faltante "ajustarNada"!
rompe el
Lo uso con Textview Working great tnx
Sunil Chaudhary
2
@Artem Russakovskii No sé quién eres, pero te amo por esta solución. Muchas gracias.
Lev
1
@Artem Russakovskii esto funciona perfectamente. Muchas gracias.
SkypeDogg
72

Puede intentar agregar este atributo dinámicamente, poniendo el siguiente código en el onCreatemétodo de su actividad:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

Esto funcionó para mí, pero eso:

android:windowSoftInputMode="adjustPan"

no

Dom
fuente
¿Agregaste el android:windowSoftInputMode="adjustPan"en AndroidManifest.xml?
Habeeb Perwad
No, ya que realmente no hizo ninguna diferencia para mí. La primera línea de código hizo el trabajo. :) @HabeebPerwad
Dom
Agregué la línea de segundos en el archivo AndoidManifest.xml. Creo que después de eso solo funcionó. así que solo pregunté.
Habeeb Perwad
1
@Dom, ¿cómo usar " getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);" en un fragmento?
Tushar Gogna
1
¡Finalmente! ¡Esto funciona! Tenía un controlador (se extiende desde FragmentActivity) y algunas vistas adjuntas (las vistas se extienden desde RelativeLayout). Entonces, en la visión problemática, me controller.getWindow()...gustó como dijiste. Obras
Alaa M.
39

Estas respuestas aquí no me ayudaron. Entonces intenté esto:

android:windowSoftInputMode="adjustResize"

Esto funcionó de maravilla, ahora el encabezado de mi aplicación no desaparece. Es más suave

amalBit
fuente
Esto casi funciona perfectamente para mí. El único problema es que la barra / fila de sugerencias del teclado aún oculta mi diseño. ¿Te enfrentaste a tal problema?
Sufian
No me he enfrentado a este problema. @Sufian
amalBit
No había enfrentado ningún problema en ese entonces. Ahora no estoy seguro. @Sufian
amalBit
Para aquellos que pueden enfrentar un problema similar, probablemente se deba a TabLayout. El problema desapareció una vez que configuré su visibilidad View.GONE. Tal vez sea hora de rediseñar mi diseño.
Sufian
13

Para hacer esto programáticamente en un fragmento, puede usar el siguiente código

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

Coloque esto en onResume ()

ChaturaM
fuente
11

Para futuros lectores.

Quería un control específico sobre este problema, así que esto es lo que hice:

De un fragmento o actividad, oculte sus otras vistas (que no son necesarias mientras el teclado está activado), luego restaurelas para resolver este problema:

            rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    Rect r = new Rect();
                    rootView.getWindowVisibleDisplayFrame(r);
                    int heightDiff = rootView.getRootView().getHeight() - (r.bottom - r.top);

                    if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
                    //ok now we know the keyboard is up...
                        view_one.setVisibility(View.GONE);
                        view_two.setVisibility(View.GONE);

                    }else{
                    //ok now we know the keyboard is down...
                        view_one.setVisibility(View.VISIBLE);
                        view_two.setVisibility(View.VISIBLE);

                    }
                }
            });
Petro
fuente
1
@Skynet Tienes toda la razón! Esta fue una solución personalizada que utilicé para mi propio problema.
Petro
77
Oye, esto fue genial. Sin embargo, en el caso de que el teclado esté cerrado, hay un breve período (milisegundos) en el que la vista cambia a visible. Entonces, en lugar de establecer la visibilidad directamente, utilicé view.post(Runnable runnable)y configuré la visibilidad desde allí. Resultó genial para mí
daisura99
9

Solo una línea para agregar ...

Agregue la android:windowSoftInputMode="stateHidden|adjustPan"actividad requerida de sumanifest file .

Acabo de resolver :) :)

Sravani
fuente
8

Para los usuarios de xamarin, agregue este código al atributo Activity de la clase MainActivity,

WindowSoftInputMode =Android.Views.SoftInput.AdjustNothing

o puede agregar este código Window.SetSoftInputMode(Android.Views.SoftInput.AdjustNothing)al método OnCreate de la clase MainActivity.

Tushar patel
fuente
8

Este me funcionó

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
Suresh Pattu
fuente
7

Hasta ahora, las respuestas no me ayudaron, ya que tengo un botón y un campo de entrada de texto (uno al lado del otro) debajo de la vista de texto que el teclado seguía ocultando, pero esto ha resuelto mi problema:

android:windowSoftInputMode="adjustResize"
Michael McDowell
fuente
7

Agregue el siguiente código a la 'actividad' del archivo de manifiesto.

android:windowSoftInputMode="adjustResize"
Jose Kurian
fuente
Esto funciona bien Sin embargo, solo para aconsejar, no funciona bien cuando se usa el porcentaje. Porque reajusta algunos elementos. Entonces, si tiene elementos de Restricciones con porcentaje, tendrá un problema. Utilice wrap_content en su lugar y funcionará muy bien.
Thiago Silva
7
android:windowSoftInputMode="stateHidden|adjustNothing"

Este código funciona

amyShamna
fuente
Creo que android: windowSoftInputMode = "stateHidden | ajustarPan" también debería funcionar.
Arthur Sady Cordeiro Rossetti
6

Esto fue lo mejor que funcionó para mí.

android:windowSoftInputMode="adjustNothing"

¡Intentalo!

rajlaxmi_jagdale
fuente
4

Bueno, he visto estas respuestas, pero en mi caso caí en el mismo problema y obtuve refugio a través de una solución muy práctica y fácil que implica poner un atributo inocente muy pequeño en su etiqueta Scrollview que reside en su archivo xml. Es decir

android:isScrollContainer="false"

¡Buena suerte!

Ali Nawaz
fuente
4
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

Este me está funcionando.

Zhang Slardar
fuente
2

Para la vista de desplazamiento:

si después de agregar android:windowSoftInputMode="stateHidden|adjustPan"su Manifiesto de Android y aún no funciona.

Puede verse afectado porque cuando aparezca el teclado, estará en una vista de desplazamiento y si su botón / cualquier objeto no está en su vista de desplazamiento, los objetos seguirán el teclado y se moverán en su posición.

Revisa tu xml donde está tu botón y asegúrate de que esté debajo de tu soporte de Vista de desplazamiento y no fuera de él.

Espero que esto ayude. :RE

Yils
fuente
2

En mi caso, necesitaba que el teclado permaneciera oculto y, justo después de hacer clic en el botón, mi diseño debe ajustarse, por lo que simplemente agregué este comando en el manifiesto y lo hice súper bien.

android:windowSoftInputMode="stateHidden|adjustResize"
Rafael Rodrigues
fuente
2

Cuando desee ocultar la vista cuando abra el teclado.

Agregue esto a su Actividad en el archivo de manifiesto

android:windowSoftInputMode="stateHidden|adjustPan"
Hakim Khan
fuente
2

Ninguno de ellos funcionó para mí, prueba este

 private void scrollingWhileKeyboard() {
    drawerlayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            Rect r = new Rect();
            try {
                drawerlayout.getWindowVisibleDisplayFrame(r);
                int screenHeight = drawerlayout.getRootView().getHeight();
                int keypadHeight = screenHeight - r.bottom;
                if (keypadHeight > screenHeight * 0.15) {
                    tabLayout.setVisibility(View.GONE);
                } else {
                    tabLayout.setVisibility(View.VISIBLE);
                }
            } catch (NullPointerException e) {

            }
        }
    });

}
Saljith Kj
fuente
1

La ventana principal de la actividad no cambiará de tamaño para dejar espacio para el teclado virtual. Por el contrario, el contenido de la ventana se desplazará automáticamente para que el teclado nunca oscurezca el foco actual y los usuarios siempre puedan ver lo que están escribiendo.

android:windowSoftInputMode="adjustPan"

Esta podría ser una mejor solución para lo que deseabas.

usuario3243900
fuente
1

Intenta usar esto:

android:windowSoftInputMode="stateHidden|adjustPan"
Ashish Gautam
fuente
1

Este código puede ayudarte. Úselo en su oncreatemétodo.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Shiv prakash Yadav
fuente
Intenté esto pero tengo problemas en los que la vista corta un poco la parte inferior de la vista y hace que la vista se superponga al tiempo anterior. ¿Alguna idea sobre qué diseño cambia o qué se necesita? stackoverflow.com/questions/39909897/…
Lion789
1

Incluya en su archivo de manifiesto en la actividad que desea mostrar. Pero asegúrese de no utilizar la actividad de pantalla completa

android:windowSoftInputMode="adjustPan"
user3419461
fuente
1

@manifiesto en su actividad:

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
Juan mendez
fuente
1

He resuelto mi problema agregando

 android:windowSoftInputMode="adjustNothing" 

En archivo de manifiesto agregar.

y hacer que la restricción de Recyclerviews seaScrollContainer en falso.

android:isScrollContainer="false"
MILLONES DE GASHAW
fuente