android中adjustResize和adjustPan之间的区别?


136

我试图编写一个代码,该代码用于在软键盘出现时重新调整UI组件的大小。当我使用adjustResize时,它会调整UI组件的大小,同时AdjustPan给我相同的输出。我想知道它们之间的区别以及何时使用每个组件?哪一个(adjustPan或AdjustResize)适合调整UI大小?

这是我的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>

Answers:


237

Android开发者网站链接

“调整大小”

活动的主窗口始终会调整大小,以便为屏幕上的软键盘腾出空间。

“调整盘”

活动的主窗口未调整大小以为软键盘腾出空间。而是,窗口的内容会自动平移,以使当前焦点不会被键盘遮挡,并且用户始终可以看到他们在键入什么。通常,这不如调整大小那么可取,因为用户可能需要关闭软键盘才能到达窗口的遮盖部分并与之交互。

根据您的评论,在您的活动清单中使用以下

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

1
感谢您的好评。现在我的UI有问题。我的版式底部有一个edittext和一个按钮。当出现软键盘时,我想在软键盘上方显示这些内容。我该如何实现。您能帮我解决这个问题吗?
androidcodehunter

1
这对我不起作用。实际上,我想要的是:当我尝试在Edittext字段中编写内容时,我只想在软键盘上方显示Edittext和Button。我尝试了您的解决方案,但无法正常工作。
androidcodehunter

哎呀..它对我有用..反正..可以使用scrollview吗?
stinepike

2
当用户界面可用于调整大小时,adjustResize仅提供解决方案,但如果我再添加5个edittext,则它将无法工作。当无法调整UI大小时,是否可以在软键盘上方显示按钮和edittext。当我测试此问题时,实际上会出现问题。
androidcodehunter

1
@support_ms为什么需要〜“ replace AdjustResize to AdjustPan”?
IgorGanapolsky

30

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

正如文档所说,请记住正确的值组合:

该设置必须是下表中列出的值之一,或者是一个“状态...”值加上一个“调整...”值的组合。在任一组中设置多个值(例如,多个“状态...”值)会产生不确定的结果。各个值用竖线(|)分隔。例如:

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

无法正常工作,我的屏幕落后于软输入
MSD

6

您可以android:windowSoftInputMode="stateAlwaysHidden|adjustResize"在AndroidManifest.xml中用于当前活动,并android:fitsSystemWindows="true"在样式或rootLayout中使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.