Unterschied zwischen adjustResize und adjustPan in Android?

136

Ich habe versucht, einen Code zu schreiben, mit dem die Größe der UI-Komponenten geändert wird, wenn eine Softtastatur angezeigt wird. Wenn ich adjustResize verwende, werden die UI-Komponenten in der Größe angepasst und gleichzeitig hat adjustPan die gleiche Ausgabe ausgegeben. Ich möchte den Unterschied zwischen ihnen wissen und wann ich jede Komponente verwenden soll. Welches (adjustPan oder adjustResize) eignet sich zum Ändern der Benutzeroberfläche?

Hier ist meine 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>

und die Menifest-Datei:

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

Antworten:

237

Über den Link zur Android Developer Site

"adjustResize"

Die Größe des Hauptfensters der Aktivität wird immer geändert, um Platz für die Softtastatur auf dem Bildschirm zu schaffen.

"adjustPan"

Die Größe des Hauptfensters der Aktivität wird nicht geändert, um Platz für die Softtastatur zu schaffen. Vielmehr wird der Inhalt des Fensters automatisch verschoben, sodass der aktuelle Fokus nie durch die Tastatur verdeckt wird und Benutzer immer sehen können, was sie eingeben. Dies ist im Allgemeinen weniger wünschenswert als die Größenänderung, da der Benutzer möglicherweise die Softtastatur schließen muss, um auf verdeckte Teile des Fensters zuzugreifen und mit diesen zu interagieren.

Verwenden Sie gemäß Ihrem Kommentar Folgendes in Ihrem Aktivitätsmanifest

<activity android:windowSoftInputMode="adjustResize"> </activity>
Stinepike
quelle
1
Vielen Dank für Ihre nette Antwort. Jetzt habe ich ein Problem mit meiner Benutzeroberfläche. Ich habe einen Edittext und eine Schaltfläche am unteren Rand meines Layouts. Ich möchte diese über der Softtastatur anzeigen, wenn die Softtastatur angezeigt wird. Wie kann ich das erreichen? Können Sie mir helfen, dieses Problem zu lösen?
Android Codehunter
1
Das funktioniert bei mir nicht. Eigentlich das, was ich wollte: Ich möchte nur Edittext und Button über der Softtastatur anzeigen, wenn ich versuche, etwas in das Edittext-Feld zu schreiben. Ich habe Ihre Lösung ausprobiert, aber nicht funktioniert.
Android Codehunter
oops .. es hat bei mir funktioniert .. sowieso .. ist es möglich, scrollview zu verwenden?
Stinepike
2
adjustResize bietet nur dann eine Lösung, wenn die Benutzeroberfläche für die Größenänderung verfügbar ist. Wenn ich jedoch 5 weitere Edittext-Dateien eingebe, funktioniert dies nicht. Ist es möglich, Schaltflächen und Edittext über der Softtastatur anzuzeigen, wenn die Benutzeroberfläche nicht für eine Größenänderung verfügbar ist? Eigentlich stellt sich die Frage, wenn ich dieses Problem teste.
Android Codehunter
1
@support_ms Warum ist ~ "adjustResize durch adjustPan ersetzen" erforderlich?
IgorGanapolsky
30

adjustResize = Größe des Seiteninhalts ändern

adjustPan = Seiteninhalt verschieben, ohne die Größe des Seiteninhalts zu ändern

Jayakrishnan PM
quelle
Tolle Erklärung!
Vlad
16

Als Anfänger war ich auch ein bisschen verwirrt zwischen adjustResize und adjustPan. Die oben angegebenen Definitionen sind korrekt.
AdjustResize: Die Größe des Inhalts der Hauptaktivität wird geändert, um Platz für weiche Eingaben zu schaffen, z. B. Tastatur.
AdjustPan: Anstatt die Größe des Gesamtinhalts des Fensters zu ändern , wird nur der Inhalt
verschoben, sodass der Benutzer immer sehen kann, was er eingibt. AdjustNothing: Wie der Name schon sagt, ist nichts Größe geändert oder verschoben. Die Tastatur wird geöffnet, unabhängig davon, ob der Inhalt ausgeblendet wird oder nicht.

Ich habe ein Beispiel zum besseren Verständnis erstellt.
Unten ist meine XML-Datei:

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

Hier ist die Entwurfsansicht des XML- Beispiels " AdjustResize" unten: Beispiel " AdjustPan" unten: Beispiel " AdjustNothing" unten:
Originalansicht


Beispiel für adjustResize


Beispiel für adjustPan


nichts anpassen Beispiel

Nadeem Shaikh
quelle
9

Beachten Sie , wie doc sagt, auch die richtige Wertekombination:

Die Einstellung muss einer der in der folgenden Tabelle aufgeführten Werte oder eine Kombination aus einem "Status ..." - Wert und einem "Einstellen ..." - Wert sein. Das Festlegen mehrerer Werte in einer Gruppe - beispielsweise mehrerer "Status ..." - Werte - hat undefinierte Ergebnisse. Einzelne Werte werden durch einen vertikalen Balken (|) getrennt. Beispielsweise:

<activity android:windowSoftInputMode="stateVisible|adjustResize" . . . >
Maskieren
quelle
funktioniert nicht, mein Bildschirm geht hinter die weiche Eingabe
MSD
6

Sie können android:windowSoftInputMode="stateAlwaysHidden|adjustResize"in AndroidManifest.xml für Ihre aktuelle Aktivität und android:fitsSystemWindows="true"in Stilen oder in rootLayout verwenden.

TTKatrina
quelle