Défilement de la page lorsque le clavier virtuel apparaît


99

J'ai une <ScrollView>mise en page:

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

Comme vous le voyez ci-dessus, la mise en page simple se compose de trois champs de saisie et d'un bouton "Ok".

Je lance mon application avec la mise en page ci-dessus, lorsque je tape sur le 1er champ de saisie ( @+id/input_one), le clavier virtuel apparaîtra du bas de l'écran, il masque le 3ème champ de saisie et le bouton "Ok".

Depuis que je l'utilise <ScrollView>, je pensais pouvoir faire défiler la page vers le haut afin de voir le 3ème champ de saisie et le bouton "Ok" qui sont cachés par le clavier logiciel , mais la page ne peut pas faire défiler . Pourquoi? Comment s'en débarrasser? en gros, je voudrais voir tous les champs de saisie et le bouton "Ok", même le clavier logiciel est apparu.


1
supprimez le <ScrollView>, LinearLayout devrait être votre mise en page externe, cela fonctionnera, j'espère même si le sofkeyboard apparaît.
Abid A. Chaudhary

1
@pakshaheen Cela ne résoudra pas le problème lorsque le scrollview est requis.
Luten

Réponses:


125

Je fixe le problème en définissant l'attribut suivant dans <activity>des AndroidManifest.xml

android:windowSoftInputMode="adjustResize"

12
Vous n'avez pas besoin de stateVisible. Cela fera apparaître le clavier virtuel lorsque l'application est lancée même lorsque l'utilisateur n'est pas concentré sur un EditText
RajV

c'est un clavier ouvert automatiquement même s'il n'y a pas d'edittext
Mr X

37

Ok, j'ai cherché plusieurs heures maintenant pour trouver le problème, et je l'ai trouvé.

Aucun des changements ne m'a plu fillViewport="true"ou ne android:windowSoftInputMode="adjustResize"m'a aidé.

J'utilise Android 4.4 et c'est la grosse erreur :

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

D'une manière ou d'une autre, les thèmes Plein écran empêchent les ScrollViews de défiler lorsque le SoftKeyboard est visible.

Pour le moment, j'ai fini par utiliser ceci à la place:

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

Je ne sais pas comment me débarrasser de la barre système supérieure avec affichage de l'heure et de la batterie, mais au moins j'ai eu le problème.

J'espère que cela aidera les autres qui ont le même problème.

EDIT: J'ai une petite solution de contournement pour mon cas, alors je l'ai posté ici :

Je ne sais pas si cela fonctionnera pour vous, mais cela vous aidera certainement à comprendre et à clarifier certaines choses.

EDIT2: Voici un autre bon sujet qui vous aidera à aller dans la bonne direction ou même à résoudre votre problème.


+1 Dans mon cas, la barre d'état a été masquée par une bibliothèque tierce dans le code: getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
de.

@qweret Et si j'ai besoin des deux? Plein écran et défilement.
Prabs

@Prabs Avez-vous trouvé une solution? Je veux aussi le plein écran et le défilement.
Johny

@Johny Non. Pour l'instant, j'utilise le plein écran pour toute l'application, sauf cette activité avec défilement3.
Prabs

@Prabs La seule solution que je pensais est d'avoir une barre d'état transparente, mais dans mon cas, c'est toujours un problème car je veux prendre en charge l'API> = 16. Avez-vous une idée?
Johny

20

Pour moi, la seule chose qui fonctionne est de mettre dans l'activité dans le manifeste cet attribut:

android:windowSoftInputMode="stateHidden|adjustPan"

Pour ne pas afficher le clavier lors de l'ouverture de l'activité et ne pas chevaucher le bas de la vue.


14

mettez ceci dans votre manifeste comme ceci en mode Pas de plein écran

android:windowSoftInputMode="stateVisible|adjustPan" 

dans ton manifeste

<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
J'ai essayé mais malheureusement, pas de chance du tout ... Cependant, la vue racine n'est pas un ScrollView, mais un RelativeLayoutqui contient un LinearLayoutqui contient alors unScrollView
James Heald


8

Regarde ça.

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

3

Cela n'a fonctionné que pour moi:

android:windowSoftInputMode="adjustPan"

2

Aussi, si vous souhaitez le faire par programme, ajoutez simplement la ligne ci-dessous au onCreate de l'activité.

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

1

Vous pouvez essayer d'utiliser le code suivant pour résoudre votre problème:

 <activity
     android:name=".DonateNow"
     android:label="@string/title_activity_donate_now"
     android:screenOrientation="portrait"
     android:theme="@style/AppTheme"
     android:windowSoftInputMode="stateVisible|adjustPan">
 </activity>

17
Vous devriez vous donner la peine d'expliquer ce que fait votre code au lieu de simplement poster un code fragmentaire comme réponse.
Angel Politis

0

Eh bien, la réponse la plus simple que j'ai essayée est simplement de supprimer votre code, ce qui fait passer l'activité en plein écran.J'avais un code comme celui-ci qui était responsable de faire passer mon activité en plein écran:

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

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

Je viens de supprimer mon code et cela fonctionne parfaitement bien si vous voulez y parvenir avec votre plein écran, vous devrez essayer d'autres méthodes

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.