178 votes

Différence entre adjustResize et adjustPan dans Android ?

J'ai essayé d'écrire un code qui est utilisé pour redimensionner les composants de l'IU quand clavier logiciel 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 savoir 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>

287voto

Nobody Points 30

De la Lien vers le site des développeurs Android

"adjustResize"

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

"adjustPan"

La fenêtre principale de l'activité n'est pas redimensionnée pour faire place au soft clavier souple. Au contraire, le contenu de la fenêtre est automatiquement balayé de manière à ce que le clavier ne masque jamais le focus actuel et que les utilisateurs et que les utilisateurs puissent toujours voir ce qu'ils tapent. Cette méthode est généralement moins souhaitable que le redimensionnement, car l'utilisateur peut être amené à fermer le clavier logiciel pour pour accéder aux parties masquées de la fenêtre et interagir avec elles.

d'après votre commentaire, utilisez ce qui suit dans votre manifeste d'activité

<activity android:windowSoftInputMode="adjustResize"> </activity>

59voto

Nadeem Shaikh Points 146

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 aux entrées douces, c'est-à-dire au 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.
Ajustez rien : Comme son nom l'indique, rien n'est redimensionné ni balayé. Le clavier est ouvert tel quel, qu'il cache le contenu ou non.

J'ai créé un exemple pour une meilleure compréhension
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 du design du xml
original view

AjusterRedimensionner Exemple ci-dessous :
adjustResize example

Exemple d'AdjustPan ci-dessous :
adjustPan example

L'exemple d'AjustementRien ci-dessous :
adjustNothing example

51voto

Jayakrishnan PM Points 2107

adjustResize \= redimensionner le contenu de la page

adjustPan \= déplacer le contenu de la page sans le redimensionner

13voto

Chandler Points 1388

Merci @Nadeem pour l'inspiration.

Cela peut démontrer la différence de manière plus intuitive.

Lorsque le clavier n'est pas affiché :

noKeyboard

Lorsque le clavier virtuel affiche

Compare differences

Sur mon simulateur, adjustUnspecified a le même résultat avec adjustPan .

Voici le fichier xml de mise en page :

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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">

    <!-- This layout takes all the reset of the screen -->
    <LinearLayout
        android:id="@+id/layout_colors"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="vertical"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toTopOf="@id/et_input_field"
        >
        <!-- Divide the layout into 3 different colors -->
        <View
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="@android:color/holo_red_light"
            />
        <View
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="@android:color/holo_green_light"
            />
        <View
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="@android:color/holo_blue_light"
            />
    </LinearLayout>

    <EditText
        android:id="@+id/et_input_field"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:maxLines="1"
        android:imeOptions="actionDone"
        app:layout_constraintBottom_toBottomOf="parent"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

12voto

Tomask Points 1030

Comme doc dit également garder à l'esprit la bonne combinaison de valeurs :

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

<activity android:windowSoftInputMode="stateVisible|adjustResize" . . . >

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X