ความแตกต่างระหว่าง adjustmentResize และ adjustmentPan ใน Android?


141

ฉันพยายามเขียนโค้ดที่ใช้เพื่อปรับขนาดคอมโพเนนต์ UI ใหม่เมื่อซอฟต์คีย์บอร์ดปรากฏขึ้น เมื่อฉันใช้adjustResizeมันปรับขนาดคอมโพเนนต์ UI และในเวลาเดียวกันก็ปรับขนาดให้ผลลัพธ์เดียวกัน ฉันต้องการทราบความแตกต่างระหว่างพวกเขาและเวลาที่จะใช้แต่ละองค์ประกอบ? อันไหน (adjustmentPan หรือ adjustmentResize) ที่ดีสำหรับการปรับขนาด 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>

และไฟล์ 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>

คำตอบ:


244

จากลิงค์ไซต์นักพัฒนาซอฟต์แวร์ Android

"ปรับขนาด"

หน้าต่างหลักของกิจกรรมจะถูกปรับขนาดเสมอเพื่อให้มีที่ว่างสำหรับแป้นพิมพ์อ่อนบนหน้าจอ

"ปรับแพน"

หน้าต่างหลักของกิจกรรมไม่ได้ถูกปรับขนาดเพื่อให้มีที่ว่างสำหรับคีย์บอร์ดแบบนุ่ม แต่เนื้อหาของหน้าต่างจะถูกแพนโดยอัตโนมัติเพื่อให้แป้นพิมพ์ไม่บดบังโฟกัสปัจจุบันและผู้ใช้จะเห็นสิ่งที่กำลังพิมพ์อยู่เสมอ โดยทั่วไปสิ่งนี้เป็นที่พึงปรารถนาน้อยกว่าการปรับขนาดเนื่องจากผู้ใช้อาจจำเป็นต้องปิดแป้นพิมพ์แบบอ่อนเพื่อเข้าถึงและโต้ตอบกับส่วนที่บดบังของหน้าต่าง

ตามความคิดเห็นของคุณใช้การติดตามในรายการกิจกรรมของคุณ

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

1
ขอบคุณสำหรับคำตอบที่ดีของคุณ ตอนนี้ฉันมีปัญหากับ UI ของฉัน ฉันมีข้อความแก้ไขและปุ่มที่ด้านล่างของเค้าโครง ฉันต้องการแสดงสิ่งเหล่านั้นเหนือซอฟต์คีย์บอร์ดเมื่อซอฟต์คีย์บอร์ดปรากฏขึ้น ฉันจะบรรลุเป้าหมายนี้ได้อย่างไร คุณสามารถช่วยฉันแก้ปัญหานี้ได้หรือไม่?
androidcodehunter

1
นี่ใช้ไม่ได้สำหรับฉัน จริงๆแล้วสิ่งที่ฉันต้องการ: ฉันแค่ต้องการแสดง Edittext และ Button เหนือซอฟต์คีย์บอร์ดเมื่อฉันพยายามเขียนบางสิ่งในฟิลด์ Edittext ฉันลองวิธีแก้ปัญหาของคุณแล้ว แต่ไม่ได้ผล
androidcodehunter

อ๊ะ .. มันใช้ได้สำหรับฉัน .. อย่างไรก็ตาม .. มันเป็นไปได้ที่จะใช้ scrollview?
stinepike

2
AdjustResize จะให้โซลูชันเฉพาะเมื่อ UI พร้อมสำหรับการปรับขนาดใหม่ แต่ถ้าฉันใส่ข้อความแก้ไขอีก 5 รายการก็จะไม่สามารถใช้งานได้ เป็นไปได้หรือไม่ที่จะแสดงปุ่มและข้อความแก้ไขเหนือซอฟต์คีย์บอร์ดเมื่อ UI ไม่สามารถปรับขนาดใหม่ได้ คำถามจริงเกิดขึ้นเมื่อฉันทดสอบปัญหานี้
androidcodehunter

1
@support_ms ทำไม ~ "replace adjustResize to adjustmentPan" จึงจำเป็น?
IgorGanapolsky

38

AdjustResize = ปรับขนาดเนื้อหาของเพจ

AdjustPan = ย้ายเนื้อหาของเพจโดยไม่ปรับขนาดเนื้อหาของเพจ


คำอธิบายสุดเจ๋ง!
Vlad

24

ฉันยังสับสนเล็กน้อยระหว่าง adjustmentResize และ adjustmentPan ตอนที่ฉันยังเป็นมือใหม่ คำจำกัดความที่ให้ไว้ข้างต้นถูกต้อง
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


ปรับตัวอย่างไม่มีอะไร


9

ดังที่docกล่าวไว้ว่าให้คำนึงถึงชุดค่าผสมที่ถูกต้อง:

การตั้งค่าต้องเป็นค่าใดค่าหนึ่งที่แสดงในตารางต่อไปนี้หรือการรวมกันของค่า "สถานะ ... " หนึ่งค่าบวกค่า "ปรับ ... " หนึ่งค่า การตั้งค่าหลายค่าในกลุ่มใดกลุ่มหนึ่งเช่นค่า "สถานะ ... " หลายค่ามีผลลัพธ์ที่ไม่ได้กำหนดไว้ ค่าแต่ละค่าจะถูกคั่นด้วยแถบแนวตั้ง (|) ตัวอย่างเช่น:

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

ไม่ทำงานหน้าจอของฉันจะอยู่ด้านหลังอินพุตอ่อน
MSD

6

คุณสามารถใช้android:windowSoftInputMode="stateAlwaysHidden|adjustResize"ใน AndroidManifest.xml สำหรับกิจกรรมปัจจุบันของคุณและใช้android:fitsSystemWindows="true"ในสไตล์หรือรูทเลย์เอาต์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.