Разница между AdjustResize и AdjustPan в Android?

136

Я попытался написать код, который используется для изменения размера компонентов пользовательского интерфейса при появлении программной клавиатуры . Когда я использую AdjustResize, он изменяет размер компонентов пользовательского интерфейса и в то же время, AdjustPan дает мне тот же результат. Я хочу знать разницу между ними и когда использовать каждый компонент? Какой из них (AdjustPan или AdjustResize) подходит для изменения размера пользовательского интерфейса?

Вот мой 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>

и файл описания:

<?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
источник

Ответы:

237

Из ссылки на сайт разработчика Android

"AdjustResize"

Главное окно действия всегда изменяется, чтобы освободить место для экранной клавиатуры.

"AdjustPan"

Главное окно действия не изменено, чтобы освободить место для виртуальной клавиатуры. Скорее, содержимое окна автоматически панорамируется, так что текущий фокус никогда не скрывается клавиатурой, и пользователи всегда могут видеть, что они печатают. Это обычно менее желательно, чем изменение размера, потому что пользователю может потребоваться закрыть экранную клавиатуру, чтобы получить доступ к скрытым частям окна и взаимодействовать с ними.

в соответствии с вашим комментарием, используйте следующие в вашем манифесте деятельности

<activity android:windowSoftInputMode="adjustResize"> </activity>
stinepike
источник
1
спасибо за ваш хороший ответ. Теперь у меня проблема с моим пользовательским интерфейсом. У меня есть текст редактирования и кнопка внизу моего макета. Я хочу показать те над софт-клавиатурой, когда появляется софт-клавиатура. Как я могу этого добиться. Можете ли вы помочь мне решить эту проблему?
androidcodehunter
1
Это не работает для меня. На самом деле то, что я хотел: я просто хочу показать Edittext и Button над софт-клавиатурой, когда я пытаюсь что-то написать в поле Edittext. Я попробовал ваше решение, но не работает.
Androidcodehunter
упс .. у меня сработало .. все равно .. можно ли использовать scrollview?
stinepike
2
AdjustResize предоставляет решение только тогда, когда пользовательский интерфейс доступен для изменения размера, но если я добавлю еще 5 edittext, он не сможет работать. Можно ли показывать кнопку и редактировать текст над софт-клавиатурой, когда пользовательский интерфейс недоступен для изменения размера. На самом деле вопрос возникает, когда я тестирую эту проблему.
androidcodehunter
1
@support_ms Зачем ~ "заменить AdjustResize для AdjustPan" необходимо?
Игорь Ганапольский
31

AdjustResize = изменить размер содержимого страницы

AdjustPan = переместить содержимое страницы без изменения размера содержимого страницы

Джайякришнана
источник
Потрясающее объяснение!
Влад
16

Я также был немного смущен между AdjustResize и AdjustPan, когда я был новичком. Определения, приведенные выше, являются правильными.
AdjustResize: содержимое основного действия изменено, чтобы освободить место для мягкого ввода, т.е. клавиатуры.
AdjustPan: вместо изменения общего содержимого окна, оно выполняет только панорамирование содержимого, чтобы пользователь всегда мог видеть, что он печатает.
AdjustNothing: так как название предполагает, что ничего не изменить размер или панорамирование. Клавиатура открыта независимо от того, скрывает ли она содержимое или нет.

У меня есть пример для лучшего понимания
Ниже приведен мой 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>

Вот пример дизайна xml AdjustResize Пример ниже: AdjustPan Пример ниже: AdjustNothing Пример ниже:
оригинальный вид


Пример AdjustResize


Пример AdjustPan


Пример AdjustNothing

Надим Шейх
источник
9

Как говорит док, имейте в виду правильную комбинацию значений:

Параметр должен быть одним из значений, перечисленных в следующей таблице, или комбинацией одного значения «состояние ...» плюс одно значение «настроить ...». Установка нескольких значений в любой группе - например, нескольких значений «state ...» - приводит к неопределенным результатам. Отдельные значения разделены вертикальной чертой (|). Например:

<activity android:windowSoftInputMode="stateVisible|adjustResize" . . . >
Tomask
источник
не работает, мой экран идет за мягким вводом
MSD
6

Вы можете использовать android:windowSoftInputMode="stateAlwaysHidden|adjustResize"в AndroidManifest.xml для своей текущей деятельности, а также использовать android:fitsSystemWindows="true"в стилях или rootLayout.

TTKatrina
источник