Różnica między AdjustResize i AdjustPan w systemie Android?

136

Próbowałem napisać kod, który jest używany do zmiany rozmiaru komponentów interfejsu użytkownika, gdy pojawia się klawiatura programowa. Kiedy używam AdjustResize, zmienia rozmiar komponentów interfejsu użytkownika, a jednocześnie adjustPan dał mi ten sam wynik. Chcę poznać różnicę między nimi i kiedy używać każdego komponentu? Który z nich (adjustPan lub adjustResize) jest dobry do zmiany rozmiaru interfejsu użytkownika?

Oto mój 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>

i plik 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
źródło

Odpowiedzi:

237

Z linku do witryny programistów Androida

„adjustResize”

Rozmiar okna głównego działania jest zawsze zmieniany, aby zrobić miejsce na klawiaturę ekranową.

„adjustPan”

Rozmiar okna głównego działania nie jest zmieniany, aby zrobić miejsce na klawiaturę ekranową. Zamiast tego zawartość okna jest automatycznie przesuwana, aby bieżący fokus nigdy nie był zasłaniany przez klawiaturę, a użytkownicy zawsze mogli zobaczyć, co piszą. Jest to generalnie mniej pożądane niż zmiana rozmiaru, ponieważ użytkownik może potrzebować zamknąć miękką klawiaturę, aby dostać się i wejść w interakcję z zasłoniętymi częściami okna.

zgodnie z Twoim komentarzem, użyj obserwowania w swoim manifeście aktywności

<activity android:windowSoftInputMode="adjustResize"> </activity>
stinepike
źródło
1
dziękuję za miłą odpowiedź. Teraz mam problem z moim interfejsem użytkownika. Mam plik edittext i przycisk u dołu mojego układu. Chcę pokazać te nad klawiaturą programową, gdy pojawi się klawiatura programowa. Jak mogę to osiągnąć. Czy możesz mi pomóc rozwiązać ten problem?
androidcodehunter
1
To nie działa dla mnie. Właściwie to, czego chciałem: po prostu chcę pokazać Edittext i Button nad klawiaturą, kiedy próbuję napisać coś w polu Edittext. Wypróbowałem twoje rozwiązanie, ale nie działa.
androidcodehunter
ups .. to zadziałało dla mnie .. w każdym razie .. czy można używać scrollview?
stinepike
2
AdjustResize zapewnia rozwiązanie tylko wtedy, gdy interfejs użytkownika jest dostępny do zmiany rozmiaru, ale jeśli umieszczę 5 więcej edytorów tekstu, to nie będzie działać. Czy można wyświetlić przycisk i edittext nad klawiaturą programową, gdy interfejs użytkownika nie jest dostępny do zmiany rozmiaru? Właściwie to pojawia się pytanie, kiedy testuję ten problem.
androidcodehunter
1
@support_ms Dlaczego ~ „replace adjustResize to adjustPan” jest konieczne?
IgorGanapolsky
30

adjustResize = zmień rozmiar zawartości strony

adjustPan = przenieś zawartość strony bez zmiany rozmiaru zawartości strony

Jayakrishnan PM
źródło
Niesamowite wyjaśnienie!
Vlad
16

Byłem też trochę zdezorientowany, kiedy byłem początkującym użytkownikiem, jeśli chodzi o adjustResize i adjustPan. Podane powyżej definicje są poprawne.
AdjustResize: Rozmiar zawartości głównego działania jest zmieniany, aby zrobić miejsce na miękkie wprowadzanie, np. Klawiaturę
AdjustPan: Zamiast zmieniać rozmiar całej zawartości okna, przesuwa zawartość tylko w taki sposób, aby użytkownik zawsze mógł zobaczyć, co pisze.
AdjustNothing: Jak sugeruje nazwa, nic nie jest zmieniony rozmiar lub panoramiczny. Klawiatura jest otwierana bez względu na to, czy ukrywa zawartość, czy nie.

Stworzyłem przykład dla lepszego zrozumienia
Poniżej znajduje się mój plik 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>

Oto widok projektu XML AdjustResize Przykład poniżej: Przykład AdjustPan poniżej: AdjustNothing Przykład poniżej:
oryginalny widok


Przykład adjustResize


Przykład adjustPan


Przykład dostosowaniaNothing

Nadeem Shaikh
źródło
9

Jak mówi doc , pamiętaj również o poprawnej kombinacji wartości:

Ustawienie musi być jedną z wartości wymienionych w poniższej tabeli lub kombinacją jednej wartości „stanu ...” i jednej wartości „wyreguluj ...”. Ustawienie wielu wartości w dowolnej grupie - na przykład wielu wartości „stanu ...” - ma niezdefiniowane wyniki. Poszczególne wartości są oddzielone pionową kreską (|). Na przykład:

<activity android:windowSoftInputMode="stateVisible|adjustResize" . . . >
Maskować
źródło
nie działa, mój ekran przechodzi za miękkim wejściem
MSD
6

Możesz użyć android:windowSoftInputMode="stateAlwaysHidden|adjustResize"w AndroidManifest.xml dla swojej bieżącej aktywności i używać android:fitsSystemWindows="true"w stylach lub rootLayout.

TTKatrina
źródło