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.


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"

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.


+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.


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>

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


8

mira esto.

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

3

Esto solo funcionó para mí:

android:windowSoftInputMode="adjustPan"

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

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>

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

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.