Differenza tra AdjustResize e AdjustPan in Android?


136

Ho provato a scrivere un codice che viene utilizzato per ridimensionare i componenti dell'interfaccia utente quando viene visualizzata la tastiera virtuale. Quando uso AdjustResize, ridimensiona i componenti dell'interfaccia utente e allo stesso tempo AdjustPan mi ha dato lo stesso output. Voglio sapere la differenza tra loro e quando usare ogni componente? Quale (AdjustPan o AdjustResize) è buono per ridimensionare l'interfaccia utente?

Ecco il mio 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>

e il file manifest:

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

Risposte:


237

Dal link del sito per sviluppatori Android

"AdjustResize"

La finestra principale dell'attività viene sempre ridimensionata per fare spazio alla tastiera virtuale sullo schermo.

"AdjustPan"

La finestra principale dell'attività non viene ridimensionata per fare spazio alla tastiera virtuale. Piuttosto, il contenuto della finestra viene automaticamente spostato in modo che la messa a fuoco corrente non venga mai oscurata dalla tastiera e gli utenti possano sempre vedere ciò che stanno digitando. Questo è generalmente meno desiderabile del ridimensionamento, perché l'utente potrebbe aver bisogno di chiudere la tastiera per accedere e interagire con le parti oscurate della finestra.

in base al tuo commento, utilizza quanto segue nel manifest di attività

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

1
grazie per la tua bella risposta. Ora sto riscontrando un problema con la mia interfaccia utente. Ho un edittext e un pulsante nella parte inferiore del mio layout. Voglio mostrare quelli sopra la tastiera virtuale quando appare la tastiera virtuale. Come posso raggiungere questo obiettivo. Potete aiutarmi a risolvere questo problema?
androidcodehunter

1
Questo non funziona per me. In realtà quello che volevo: voglio solo mostrare Edittext e Button sopra la tastiera quando provo a scrivere qualcosa nel campo Edittext. Ho provato la tua soluzione ma non funziona.
androidcodehunter,

oops .. ha funzionato per me .. comunque .. è possibile usare scrollview?
Stinepike,

2
AdjustResize fornisce una soluzione solo quando l'interfaccia utente è disponibile per il ridimensionamento, ma se inserisco altri 5 edittext, non può funzionare. È possibile mostrare pulsanti ed edittext sopra la tastiera virtuale quando l'interfaccia utente non è disponibile per ridimensionare. In realtà la domanda sorge quando provo questo problema.
androidcodehunter

1
@support_ms Perché ~ "sostituisci AdjustResize in AdjustPan" è necessario?
IgorGanapolsky,

31

AdjustResize = ridimensiona il contenuto della pagina

AdjustPan = sposta il contenuto della pagina senza ridimensionare il contenuto della pagina


Spiegazione fantastica!
Vlad,

16

Ero anche un po 'confuso tra regolareResize e AdjustPan quando ero un principiante. Le definizioni sopra riportate sono corrette.
AdjustResize: il contenuto dell'attività principale viene ridimensionato per fare spazio per l'input
software, ad esempio la tastiera AdjustPan: invece di ridimensionare il contenuto complessivo della finestra, esegue una panoramica del contenuto in modo che l'utente possa sempre vedere ciò che sta digitando
AdjustNothing: poiché il nome suggerisce che nulla è ridimensionato o pan. La tastiera viene aperta in quanto non importa se nasconde il contenuto o meno.

Ho creato un esempio per una migliore comprensione
Di seguito è riportato il mio file 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>

Ecco la vista di progettazione dell'xml AdjustResize Esempio di seguito: AdjustPan Esempio di seguito: AdjustNothing Esempio di seguito:
vista originale


esempio di AdjustResize


esempio di AdjustPan


adjNiente di esempio


9

Come dice doc , tieni presente anche la combinazione di valori corretta:

L'impostazione deve essere uno dei valori elencati nella tabella seguente o una combinazione di un valore "stato ..." più un valore "regola ...". L'impostazione di più valori in entrambi i gruppi, ad esempio più valori "stato ...", produce risultati non definiti. I singoli valori sono separati da una barra verticale (|). Per esempio:

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

non funziona, il mio schermo sta andando dietro l'ingresso soft
MSD,

6

È possibile utilizzare android:windowSoftInputMode="stateAlwaysHidden|adjustResize"in AndroidManifest.xml per l'attività corrente e utilizzare android:fitsSystemWindows="true"in stili o rootLayout.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.