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.

Leem.fin
la source
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
voici le code de travail. stackoverflow.com/questions/7417123/…
Venkat

Réponses:

125

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

android:windowSoftInputMode="adjustResize"
Leem.fin
la source
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.

qweret
la source
+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.

Jachumbelechao Unto Mantekilla
la source
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>
user3594530
la source
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
11

Dans votre propriété de Manifestdéfinition windowSoftInputMode:

<activity android:name=".MyActivity"
          android:windowSoftInputMode="adjustNothing">
Mohammad Ersan
la source
2
@JacobRas s'il vous plaît vérifier ce lien: developer.android.com/reference/android/… il a la valeur "AdjustNothing" :)
Mohammad Ersan
2
J'ai le même problème, mais scrollview ne fonctionne pas avec AdjustNothing :(
Narendra Singh
8

Regarde ça.

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

Cela n'a fonctionné que pour moi:

android:windowSoftInputMode="adjustPan"
blueware
la source
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 );
ucMedia
la source
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>
Энхжин Амарсайхан
la source
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

Akash Gupta
la source