Différence entre AdjustResize et AdjustPan dans Android?

136

J'ai essayé d'écrire un code qui est utilisé pour redimensionner les composants de l'interface utilisateur lorsque le clavier virtuel apparaît. Lorsque j'utilise AdjustResize, il redimensionne les composants de l'interface utilisateur et en même temps, AdjustPan m'a donné le même résultat. Je veux connaître la différence entre eux et quand utiliser chaque composant? Lequel (AdjustPan ou AdjustResize) est bon pour redimensionner l'interface utilisateur?

Voici mon xml:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true" >

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

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

            <EditText
                android:id="@+id/editText5"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="45dp"
                android:ems="10"
                android:inputType="textPersonName" />

            <Button
                android:id="@+id/button1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="40dp"
                android:text="My Button" />
        </LinearLayout>
    </RelativeLayout>

</ScrollView>

et le fichier menifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.adjustscroll"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.adjustscroll.MainActivity"
            android:label="@string/app_name"
            android:windowSoftInputMode="adjustPan|adjustResize" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
androidcodehunter
la source

Réponses:

237

Depuis le lien du site des développeurs Android

"AdjustResize"

La fenêtre principale de l'activité est toujours redimensionnée pour faire de la place pour le clavier virtuel à l'écran.

"AdjustPan"

La fenêtre principale de l'activité n'est pas redimensionnée pour faire de la place pour le clavier virtuel. Au contraire, le contenu de la fenêtre est automatiquement déplacé afin que le focus actuel ne soit jamais obscurci par le clavier et que les utilisateurs puissent toujours voir ce qu'ils tapent. Ceci est généralement moins souhaitable que le redimensionnement, car l'utilisateur peut avoir besoin de fermer le clavier virtuel pour accéder et interagir avec les parties masquées de la fenêtre.

selon votre commentaire, utilisez le suivi dans votre manifeste d'activité

<activity android:windowSoftInputMode="adjustResize"> </activity>
stinepike
la source
1
merci pour votre gentille réponse. J'ai maintenant un problème avec mon interface utilisateur. J'ai un edittext et un bouton en bas de ma mise en page. Je veux afficher ceux au-dessus du clavier virtuel lorsque le clavier virtuel apparaît. Comment puis-je atteindre cet objectif. Pouvez-vous m'aider à résoudre ce problème?
androidcodehunter
1
Cela ne fonctionne pas pour moi. En fait, ce que je voulais: je veux juste afficher Edittext et Button au-dessus du clavier virtuel lorsque j'essaye d'écrire quelque chose dans le champ Edittext. J'ai essayé votre solution mais ne fonctionne pas.
androidcodehunter
oups .. cela a fonctionné pour moi .. de toute façon .. est-il possible d'utiliser scrollview?
stinepike
2
AdjustResize ne fournit une solution que lorsque l'interface utilisateur est disponible pour le redimensionnement, mais si je mets 5 edittext de plus, cela ne peut pas fonctionner. Est-il possible d'afficher le bouton et le texte édité au-dessus du clavier virtuel lorsque l'interface utilisateur n'est pas disponible pour redimensionner. En fait, une question se pose lorsque je teste ce problème.
androidcodehunter
1
@support_ms Pourquoi ~ "remplacer AdjustResize par AdjustPan" est-il nécessaire?
IgorGanapolsky
31

AdjustResize = redimensionner le contenu de la page

AdjustPan = déplacer le contenu de la page sans redimensionner le contenu de la page

Jayakrishnan
la source
Explication géniale!
Vlad
16

J'étais aussi un peu confus entre AdjustResize et AdjustPan quand j'étais débutant. Les définitions données ci-dessus sont correctes.
AdjustResize: le contenu de l'activité principale est redimensionné pour faire de la place pour la saisie
logicielle, c'est-à-dire le clavier AdjustPan: au lieu de redimensionner le contenu global de la fenêtre, il ne fait que déplacer le contenu afin que l'utilisateur puisse toujours voir ce qu'il tape
AdjustNothing: comme son nom l'indique, rien n'est redimensionné ou panoramique. Le clavier est ouvert tel quel, qu'il cache le contenu ou non.

J'ai créé un exemple pour mieux comprendre
Voici mon fichier xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:hint="Type Here"
        app:layout_constraintTop_toBottomOf="@id/button1"/>


    <Button
        android:id="@+id/button1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Button1"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@id/button2"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginBottom="@dimen/margin70dp"/>

    <Button
        android:id="@+id/button2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Button2"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toEndOf="@id/button1"
        app:layout_constraintEnd_toStartOf="@id/button3"
        android:layout_marginBottom="@dimen/margin70dp"/>

    <Button
        android:id="@+id/button3"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="Button3"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@id/button2"
        android:layout_marginBottom="@dimen/margin70dp"/>
</android.support.constraint.ConstraintLayout>

Voici la vue de conception de l' exemple xml AdjustResize ci-dessous: AdjustPan Exemple ci-dessous: AdjustNothing Exemple ci-dessous:
vue originale


Exemple d'ajustementResize


Exemple d'ajustPan


AdjustNothing exemple

Nadeem Shaikh
la source
9

Comme le dit doc , gardez également à l'esprit la combinaison de valeurs correcte:

Le paramètre doit être l'une des valeurs répertoriées dans le tableau suivant, ou une combinaison d'une valeur «état ...» plus une valeur «ajuster ...». La définition de plusieurs valeurs dans l'un ou l'autre groupe - plusieurs valeurs «état ...», par exemple - a des résultats non définis. Les valeurs individuelles sont séparées par une barre verticale (|). Par exemple:

<activity android:windowSoftInputMode="stateVisible|adjustResize" . . . >
Masquer
la source
ne fonctionne pas, mon écran passe derrière l'entrée
logicielle
6

Vous pouvez utiliser android:windowSoftInputMode="stateAlwaysHidden|adjustResize"dans AndroidManifest.xml pour votre activité actuelle et utiliser android:fitsSystemWindows="true"dans les styles ou rootLayout.

TTKatrina
la source