¿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?


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);

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


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);

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ó.!!!!!!!!!!!!


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


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);

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.


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>

6
<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

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


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.


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);

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>

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);

1

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

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

1

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

android:fitsSystemWindows="true"

¿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í.


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.


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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.