¿Mover diseños hacia arriba cuando se muestra el teclado virtual?

139

Tengo algunos elementos en un RelativeView con el conjunto de atributos de alineación inferior, cuando aparece el teclado virtual, los elementos están ocultos por el teclado virtual.

Me gustaría que se muevan hacia arriba para que, si hay suficiente espacio en la pantalla, se muestren sobre el teclado, o para que la sección sobre el teclado se pueda desplazar para que el usuario pueda ver los elementos.

¿Alguna idea sobre cómo abordar esto?

Dinedal
fuente
Referencia actualizada del blog de desarrolladores de Android
Jayabal
@Dinedal ¿Cómo se configura alinear el atributo inferior a su RelativeView ???
KJEjava48

Respuestas:

95

También puede usar este código en el onCreate()método:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Bobs
fuente
11
Para mí, incluso si configuré el ajuste de ajuste de desplazamiento de pantalla solo al texto de edición en el que he hecho clic, pero no a todo el diseño
murté el
33

Agregue AndroidManifest.xml para su actividad:

android:windowSoftInputMode="adjustPan|adjustResize"
Serhii Bohutskyi
fuente
22
Según los documentos, el comportamiento no se especifica si utiliza dos indicadores de "ajustar ..." aquí. Ver developer.android.com/guide/topics/manifest/…
user1806772
22

Realice cambios en la actividad de su archivo de manifiesto como

windowSoftInputMode="adjustResize"

O

Realice cambios en su onCreate()método en la clase de actividad como

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Jose Kurian
fuente
11
¿Por qué usas diferentes banderas?
CoolMind
La versión actual requiere el prefijo de Android: android: windowSoftInputMode = "ajustarResize"
Andrea Leganza
21

problema similar que enfrentaba con mi diseño, que consiste en una vista de desplazamiento en el interior. Cada vez que intento seleccionar texto en EditText, la barra de acción Copiar / Cortar / Pegar se mueve hacia arriba con el siguiente código, por lo que no cambia el tamaño del diseño

android:windowSoftInputMode="adjustPan"

Modificándolo como a continuación

1) AndroidManifest.xml

android:windowSoftInputMode="stateVisible|adjustResize"

2) archivo style.xml, en estilo de actividad

<item name="android:windowActionBarOverlay">true</item>

Funcionó.!!!!!!!!!!!!

Ronak Poriya
fuente
18

En AndroidManifest.xml, no olvide configurar:

 android:windowSoftInputMode="adjustResize"

y para RelativeLayout dentro de ScrollView, establezca:

 android:layout_gravity="center" or android:layout_gravity="bottom" 

Estara bien

Zahra.HY
fuente
android: layout_gravity = "center" funcionó, ¡gracias! :) ahora EditText se mueve sobre el teclado como quería
Pavel Biryukov
11

para la actividad en su inserción de método de creación debajo de la línea

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

y para fragmentos en su método onCreate

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Rahul_Pawar
fuente
10

Hay 3 pasos a seguir para desplazar la pantalla hacia arriba.

  1. Escriba en el archivo de manifiesto para su actividad:

android: windowSoftInputMode = "ajustarResizar"

  1. Agregue la siguiente línea en el método oncreate () de su actividad

getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

  1. Luego coloque toda su vista en "Scrollview" en un archivo XML como:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:background="@drawable/bg"
    android:layout_height="match_parent" 
    > 
    <RelativeLayout
         android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" >
        <TextView />
         .........
        <TextView />
        <EditText >
            <requestFocus />
        </EditText>
        <Button />
    </RelativeLayout>
 </ScrollView>

PD: No olvide agregar android: layout_gravity = "center" en el diseño relativo principal.

Heena Arora
fuente
6

Probé un método de Diego Ramírez, funciona. En AndroidManifest:

    <activity
        android:name=".MainActivity"
        android:windowSoftInputMode="stateHidden|adjustResize">
        ...
    </activity>

En activity_main.xml:

<LinearLayout ...
    android:orientation="vertical">

<Space
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1" />

<EditText
    android:id="@+id/edName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:hint="@string/first_name"
    android:inputType="textPersonName" />

<EditText ...>
...
</LinearLayout>
CoolMind
fuente
6
<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

Agregue NestedScrollView alrededor del diseño que desea desplazar, esto funcionará perfectamente

Prakash Reddy
fuente
3

He encontrado una solución a mis problemas que es bastante similar a la tuya.

En primer lugar, solo tengo un LinearLayout con 2 elementos, un ImageView y un LinearLayout que contiene 2 EditText y un Button, por lo que necesitaba mantenerlos separados en pantalla completa sin teclado, y cuando aparezca el teclado deberían verse más cerca.

Así que agregué la vista entre ellos con el atributo de altura en 0dp y el peso 1, lo que me permitió mantener mis vistas separadas una de la otra. y cuando aparece el teclado, ya que no tienen una altura fija, simplemente cambian el tamaño y mantienen el aspecto.

Voila! El tamaño del diseño y la distancia entre mis vistas es la misma cuando el teclado está presente o no.

Diego Ramírez Vásquez
fuente
66
¿Por qué no publicas el código, para una mejor comprensión?
johnkarka
Publiqué un código de muestra arriba: stackoverflow.com/a/31994697/2914140 .
CoolMind
puede lograr esto de una manera menos hacky usando una ConstraintLayouty fijando una sección superior a la parte superior y una sección inferior a la inferior. Cuando se abre el teclado, naturalmente cambiará de tamaño apretando el espacio en el medio (si lo usa adjustResize)
hmac
2
If user want this task using manifest then add this line in manifest
In manifest add this line: - android:windowSoftInputMode="adjustPan"
    e.g.
     <activity
           android:name=".ui.home.HomeActivity"
           android:screenOrientation="portrait"
           android:windowSoftInputMode="adjustPan">
     </activity>


    In Java File or Kotlin File(Programically) : - If user want this using Activity then add below line in onCreate Method

    activity!!.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
safal bhatia
fuente
Hola y bienvenido a stackoverflow, y gracias por tu respuesta. En lugar de simplemente publicar un bloque de código, ¿puede dar una breve explicación de cuál es el problema que resolvió y cómo lo resolvió? Esto ayudará a las personas que encuentren esta pregunta en el futuro a comprender mejor el problema y cómo tratarlo.
Plutiano
1

Aquí está el código de manifiesto completo

<activity
        android:name=".activities.MainActivity"
        android:windowSoftInputMode="adjustResize"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
Dantalian
fuente
1

si está en fragmentos, entonces debe agregar el código siguiente a su onCreate en su actividad, me resuelve el problema

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Pratik Mohanrao Gondil
fuente
1

En su archivo de manifiesto agregue la línea a continuación. Funcionará

<activity name="MainActivity"
    android:windowSoftInputMode="stateVisible|adjustResize">
    ...
</activity>
Shivam Garg
fuente
1

Acabo de agregar la siguiente línea al diseño de nivel superior y todo funcionó:

android:fitsSystemWindows="true"
Darush
fuente
¿Es posible que @ yash786 muestre el botón debajo del texto de edición que recibe un foco? Segunda pregunta, ¿puede compartir su archivo de diseño o responderme cómo agrega edittext a la parte superior del teclado?
Heroes84
funciona para mí evento sin android: windowSoftInputMode = "stateVisible | ajustarResize"
zoom
0

Bien, esto es muy tarde, sin embargo, he descubierto que si agrega una Vista de lista debajo del texto de edición, el teclado moverá todos los diseños bajo ese texto de edición sin mover el Vista de lista

<EditText
android:id="@+id/et"
android:layout_height="match_parent"
android:layout_width="match_parent"



/>

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"//can make as 1dp
    android:layout_below="@+id/et" // set to below editext
    android:id="@+id/view"
    >
**<any layout**

Esta es la única solución que funcionó para mí.

Omar Boshra
fuente
0

Ni un solo consejo resuelve mi problema. Ajustar panorámica es casi como el trabajo Ajustar Cambiar tamaño . Si configuro Ajustar nada más que el diseño, no se mueve hacia arriba, pero oculta mi texto de edición de la parte inferior que estoy escribiendo actualmente. Entonces, después de 24 horas de búsqueda continua, encontré esta fuente y resolvió mi problema.

Mahbubur Rahman Khan
fuente
0

Puede que sea tarde, pero quiero agregar algunas cosas. En Android Studio Versión 4.0.1 y Gradle Versión 6.1.1, windowSoftInputMode no funcionará como se espera si agrega los siguientes indicadores en su Actividad:

getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
        );

Después de perder mucho tiempo, he encontrado ese truco. Para que adjustResizeo AdjustPancualquier atributo de windowSoftInputModefuncione correctamente, debe eliminarlo de su actividad.

Shehryar Aɱɩŋ
fuente