Android'de adjustResize ve adjustPan arasındaki fark nedir?


136

Yazılım klavyesi göründüğünde UI bileşenlerini yeniden boyutlandırmak için kullanılan bir kod yazmaya çalıştım . AdjustResize kullandığımda , UI bileşenlerini yeniden boyutlandırır ve aynı zamanda adjustPan bana aynı çıktıyı verir. Aralarındaki farkı ve her bir bileşeni ne zaman kullanacağımı bilmek istiyorum? UI'yi yeniden boyutlandırmak için hangisi (adjustPan veya adjustResize) iyidir?

İşte benim 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>

ve menifest dosyası:

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

Yanıtlar:


237

Gönderen Android Geliştirici Sitesi bağlantısını

"AdjustResize"

Etkinliğin ana penceresi, ekrandaki yumuşak klavyeye yer açmak için her zaman yeniden boyutlandırılır.

"AdjustPan"

Etkinliğin ana penceresi, yumuşak klavyeye yer açmak için yeniden boyutlandırılmaz. Bunun yerine, pencerenin içeriği otomatik olarak kaydırılır, böylece mevcut odak klavye tarafından asla gizlenmez ve kullanıcılar ne yazdıklarını her zaman görebilir. Bu genellikle yeniden boyutlandırmaktan daha az arzu edilir, çünkü kullanıcının pencerenin gizlenmiş kısımlarına ulaşmak ve etkileşimde bulunmak için yumuşak klavyeyi kapatması gerekebilir.

yorumunuza göre etkinlik bildiriminizde aşağıdakileri kullanın

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

1
güzel cevabınız için teşekkür ederim. Şimdi kullanıcı arayüzümle ilgili bir sorun yaşıyorum. Düzenimin alt kısmında bir düzenleme metni ve bir düğme var. Yazılım klavyesi göründüğünde yazılım klavyesinin üzerindekileri göstermek istiyorum. Bunu nasıl başarabilirim. Bu sorunu çözmeme yardım edebilir misin?
androidcodehunter

1
Bu benim için çalışmıyor. Aslında ne istedim: Edittext alanına bir şey yazmaya çalıştığımda sadece yumuşak klavye üzerinde Edittext ve Button göstermek istiyorum. Çözümünüzü denedim ama çalışmıyor.
androidcodehunter

ayy .. benim için çalıştı .. neyse .. scrollview kullanmak mümkün mü?
stinepike

2
adjustResize yalnızca UI yeniden boyutlandırma için kullanılabilir olduğunda çözüm sağlar, ancak 5 tane daha düzenleme metni koyarsam işe yaramaz. Kullanıcı arayüzü yeniden boyutlandırılamadığında düğme ve düzenleme metnini yazılım klavyesinin üzerinde göstermek mümkün mü? Aslında bu sorunu test ederken soru ortaya çıkıyor.
androidcodehunter

1
@support_ms Neden ~ "adjustResize to adjustPan yerine" gereklidir?
IgorGanapolsky

31

adjustResize = sayfa içeriğini yeniden boyutlandır

adjustPan = sayfa içeriğini yeniden boyutlandırmadan sayfa içeriğini taşı


Harika bir açıklama!
Vlad

16

Ben de bir acemi iken adjustResize ve adjustPan arasında biraz karıştı. Yukarıda verilen tanımlar doğrudur.
AdjustResize: Ana etkinliğin içeriği yumuşak girdi yani klavye bütünleme odasına boyutlandırılır
AdjustPan: Yerine pencerenin genel içeriğini yeniden boyutlandırma, sadece o yazarak nedir kullanıcı her zaman görebileceği şekilde içerik tavalar
: AdjustNothing adı başka bir şey değildir anlaşılacağı gibi yeniden boyutlandırıldı veya kaydırıldı. Klavye, içeriği gizleyip gizlemediğine bakılmaksızın açılır.

Daha iyi anlamak için bir örnek oluşturduk
Aşağıda benim xml dosyası:

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

Aşağıda xml AdjustResize Örneğinin tasarım görünümü verilmiştir: AdjustPan Aşağıdaki örnek: AdjustNothing Aşağıdaki örnek:
orijinal görüntü


adjustResize örneği


adjustPan örneği


Hiçbir şey örneği


9

Doc'un dediği gibi , doğru değer kombinasyonunu da unutmayın:

Ayar, aşağıdaki tabloda listelenen değerlerden biri veya bir "durum ..." değeri artı bir "ayarlama ..." değerinin birleşimi olmalıdır. Her iki grupta birden çok değer ayarlamak - örneğin birden çok "durum ..." değeri tanımsız sonuçlara yol açar. Bireysel değerler dikey bir çubukla (|) ayrılır. Örneğin:

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

çalışmıyor,
ekranım

6

Sen kullanabilirsiniz android:windowSoftInputMode="stateAlwaysHidden|adjustResize"geçerli etkinlik için AndroidManifest.xml ve kullanma android:fitsSystemWindows="true"stilleri veya rootLayout içinde.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.