Sự khác biệt giữa điều chỉnhResize và điều chỉnhPan trong Android?


136

Tôi đã cố gắng viết một mã được sử dụng để định cỡ lại các thành phần UI khi bàn phím mềm xuất hiện. Khi tôi sử dụng điều chỉnh kích thước , nó thay đổi kích thước các thành phần UI và đồng thời điều chỉnhPan cho tôi đầu ra tương tự. Tôi muốn biết sự khác biệt giữa chúng và khi nào sử dụng từng thành phần? Cái nào (điều chỉnhPan hoặc điều chỉnhResize) là tốt để thay đổi kích thước UI?

Đây là xml của tôi:

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

và tập tin rõ ràng nhất:

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

Câu trả lời:


237

Từ liên kết Trang web dành cho nhà phát triển Android

"điều chỉnh kích thước"

Cửa sổ chính của hoạt động luôn được thay đổi kích thước để nhường chỗ cho bàn phím mềm trên màn hình.

"điều chỉnh"

Cửa sổ chính của hoạt động không được thay đổi kích thước để nhường chỗ cho bàn phím mềm. Thay vào đó, nội dung của cửa sổ được tự động mở để tiêu điểm hiện tại không bị che khuất bởi bàn phím và người dùng luôn có thể thấy những gì họ đang gõ. Điều này thường ít mong muốn hơn so với thay đổi kích thước, bởi vì người dùng có thể cần phải đóng bàn phím mềm để truy cập và tương tác với các phần bị che khuất của cửa sổ.

theo nhận xét của bạn, sử dụng sau đây trong bảng kê khai hoạt động của bạn

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

1
cảm ơn bạn đã trả lời tốt đẹp của bạn. Bây giờ tôi có một vấn đề với giao diện người dùng của tôi. Tôi có một edittext và một nút ở dưới cùng của bố cục của tôi. Tôi muốn hiển thị những cái phía trên bàn phím mềm khi bàn phím mềm xuất hiện. Làm thế nào tôi có thể đạt được điều này. Bạn có thể giúp tôi giải quyết vấn đề này?
androidcodehunter

1
Điều này không làm việc cho tôi. Trên thực tế những gì tôi muốn: Tôi chỉ muốn hiển thị Edittext và Nút phía trên bàn phím mềm khi tôi cố gắng viết một cái gì đó trong trường Edittext. Tôi đã thử giải pháp của bạn nhưng không làm việc.
androidcodehunter

Rất tiếc .. nó hoạt động với tôi .. dù sao .. có thể sử dụng scrollview không?
stinepike

2
điều chỉnhResize chỉ cung cấp giải pháp khi UI có sẵn để định cỡ lại nhưng nếu tôi đặt thêm 5 edittext thì nó không thể hoạt động. Có thể hiển thị nút và edittext phía trên bàn phím mềm khi UI không có sẵn để thay đổi kích thước. Thực tế câu hỏi đang phát sinh khi tôi kiểm tra vấn đề này.
androidcodehunter

1
@support_ms Tại sao ~ "thay thế điều chỉnhResize thành điều chỉnhPan" là cần thiết?
IgorGanapolsky

30

điều chỉnhResize = thay đổi kích thước nội dung trang

điều chỉnhPan = di chuyển nội dung trang mà không thay đổi kích thước nội dung trang


Giải thích tuyệt vời!
Vlad

16

Tôi cũng có một chút nhầm lẫn giữa điều chỉnhResize và điều chỉnhPan khi tôi mới bắt đầu. Các định nghĩa được đưa ra ở trên là chính xác.
Điều chỉnh kích thước: Nội dung của hoạt động chính được thay đổi kích thước để nhường chỗ cho đầu vào mềm, ví dụ như bàn phím
Điều chỉnh: Thay vì thay đổi kích thước nội dung tổng thể của cửa sổ, nó chỉ hiển thị nội dung để người dùng luôn có thể thấy những gì anh ta đang gõ
Điều chỉnh: Như tên cho thấy không có gì thay đổi kích thước hoặc lát. Bàn phím được mở vì nó không liên quan đến việc nó có ẩn nội dung hay không.

Tôi đã tạo một ví dụ để hiểu rõ hơn
Dưới đây là tệp xml của tôi:

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

Dưới đây là khung nhìn thiết kế của xml Điều chỉnh kích thước Ví dụ bên dưới: Điều chỉnh Ví dụ bên dưới: Điều chỉnh Ví dụ dưới đây:
xem ban đầu


điều chỉnh ví dụ


ví dụ điều chỉnh


điều chỉnh ví dụ


9

Như doc nói cũng ghi nhớ sự kết hợp giá trị chính xác:

Cài đặt phải là một trong các giá trị được liệt kê trong bảng sau hoặc kết hợp một giá trị "trạng thái ..." cộng với một giá trị "điều chỉnh ...". Đặt nhiều giá trị trong một trong hai nhóm - ví dụ: nhiều giá trị "trạng thái ..." - có kết quả không xác định. Các giá trị riêng lẻ được phân tách bằng một thanh dọc (|). Ví dụ:

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

không hoạt động, màn hình của tôi đi phía sau đầu vào mềm
MSD

6

Bạn có thể sử dụng android:windowSoftInputMode="stateAlwaysHidden|adjustResize"trong AndroidManifest.xml cho hoạt động hiện tại của mình và sử dụng android:fitsSystemWindows="true"theo kiểu hoặc rootLayout.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.