Desplazamiento de página cuando aparece el teclado en pantalla

99

Tengo un <ScrollView>diseño:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_scrollview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <EditText
            android:id="@+id/input_one"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:inputType="number" >

         <EditText
            android:id="@+id/input_two"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:inputType="number" >

         <EditText
            android:id="@+id/input_three"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:inputType="number" >

          <Button
            android:id="@+id/ok_btn"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="20dp"
            android:text="@string/ok_str" />

      </LinearLayout>
</ScrollView>

Como puede ver arriba, el diseño simple consta de tres campos de entrada y un botón "Aceptar".

Ejecuto mi aplicación con el diseño anterior, cuando toco el primer campo de entrada ( @+id/input_one), el teclado virtual aparecerá en la parte inferior de la pantalla, oculta el tercer campo de entrada y el botón "Aceptar".

Desde que lo uso <ScrollView>, pensé que podía desplazar la página hacia arriba para ver el tercer campo de entrada y el botón "Aceptar" que están ocultos por el teclado virtual, pero la página no se puede desplazar . ¿Por qué? Cómo deshacerse de él? Básicamente, me gustaría ver todos los campos de entrada y el botón "Aceptar", incluso el teclado en pantalla emergente.

Leem.fin
fuente
1
elimine el <ScrollView>, LinearLayout debería ser su diseño exterior, funcionará, espero que incluso si aparece el teclado virtual.
Abid A. Chaudhary
1
@pakshaheen Eso no solucionará el problema cuando se requiera scrollview.
Luten
aquí está el código de trabajo. stackoverflow.com/questions/7417123/…
Venkat

Respuestas:

125

He arreglado el problema definiendo el atributo siguiente en <activity>de AndroidManifest.xml

android:windowSoftInputMode="adjustResize"
Leem.fin
fuente
12
No necesitas stateVisible. Eso hará que el teclado virtual aparezca cuando se inicie la aplicación incluso cuando el usuario no esté enfocado en un EditText
RajV
es un teclado abierto automáticamente incluso si no hay texto de edición
Mr X
37

Ok, he buscado varias horas para encontrar el problema y lo encontré.

Ninguno de los cambios me gustó fillViewport="true"ni android:windowSoftInputMode="adjustResize"me ayudó.

Yo uso Android 4.4 y este es el gran error :

android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"

De alguna manera, los temas de pantalla completa evitan que ScrollViews se desplace cuando el SoftKeyboard está visible.

Por el momento, terminé usando esto en su lugar:

android:theme="@android:style/Theme.Black.NoTitleBar

No sé cómo deshacerme de la barra superior del sistema con la pantalla de tiempo y batería, pero al menos tengo el problema.

Espero que esto ayude a otros que tienen el mismo problema.

EDITAR: Tengo una pequeña solución para mi caso, así que la publiqué aquí :

No estoy seguro de si esto funcionará para usted, pero definitivamente lo ayudará a comprender y aclarar algunas cosas.

EDIT2: Aquí hay otro buen tema que lo ayudará a ir en la dirección correcta o incluso a resolver su problema.

qweret
fuente
+1 En mi caso, la barra de estado estaba oculta por una biblioteca de terceros en el código: getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
de.
@qweret ¿Qué pasa si los necesito a ambos? Pantalla completa y desplazamiento.
Prabs
@Prabs ¿Encontraste alguna solución? También quiero pantalla completa y desplazamiento.
Johny
@Johny Nope. Por ahora, estoy usando la pantalla completa para toda la aplicación, excepto esa actividad con desplazamiento3.
Prabs
@Prabs La única solución que pensé es tener una barra de estado transparente, pero en mi caso sigue siendo un problema porque quiero admitir API> = 16. ¿Tiene usted alguna idea?
Johny
20

Para mí lo único que funciona es poner en la actividad en el manifiesto este atributo:

android:windowSoftInputMode="stateHidden|adjustPan"

No mostrar el teclado al abrir la actividad y no superponer la parte inferior de la vista.

Jachumbelechao a Mantekilla
fuente
14

poner esto dentro de su manifiesto de esta manera en modo sin pantalla completa

android:windowSoftInputMode="stateVisible|adjustPan" 

en tu manifiesto

<activity
    android:windowSoftInputMode="stateVisible|adjustPan"
    android:name="com.example.patronusgps.MainActivity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
usuario3594530
fuente
1
Lo intenté, pero sin afortunadamente, no tuve suerte ... Sin embargo, la vista raíz no es una ScrollView, sino una RelativeLayoutque contiene una LinearLayoutque luego contiene unaScrollView
James Heald
11

En su propiedad Manifestdefine windowSoftInputMode:

<activity android:name=".MyActivity"
          android:windowSoftInputMode="adjustNothing">
Mohammad Ersan
fuente
2
@JacobRas, por favor revise este enlace: developer.android.com/reference/android/ ... tiene el valor "AdjustNothing" :)
Mohammad Ersan
2
Tengo el mismo problema, pero scrollview no funciona con adjustNothing :(
Narendra Singh
8

mira esto.

<activity android:name=".Calculator"
    android:windowSoftInputMode="stateHidden|adjustResize" 
    android:theme="@android:style/Theme.Black.NoTitleBar">
</activity>
Ravi1187342
fuente
3

Esto solo funcionó para mí:

android:windowSoftInputMode="adjustPan"
blueware
fuente
2

Además, si desea hacerlo mediante programación, simplemente agregue la siguiente línea al onCreate de la actividad.

getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | 
            WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE );
ucMedia
fuente
1

Puede intentar usar el siguiente código para resolver su problema:

 <activity
     android:name=".DonateNow"
     android:label="@string/title_activity_donate_now"
     android:screenOrientation="portrait"
     android:theme="@style/AppTheme"
     android:windowSoftInputMode="stateVisible|adjustPan">
 </activity>
Энхжин Амарсайхан
fuente
17
Debería molestarse en explicar qué hace su código en lugar de simplemente publicar un código de pieza seca como respuesta.
Angel Politis
0

bueno, la respuesta más simple que probé es simplemente eliminar su código, lo que hace que la actividad pase a pantalla completa. Tenía un código como este que era responsable de hacer que mi actividad pasara a pantalla completa:

if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.KITKAT) {

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

Acabo de eliminar mi código y funciona completamente bien, aunque si desea lograr esto con la pantalla completa activada, tendrá que probar otros métodos

Akash Gupta
fuente