Diferença entre AdjustResize e AdjustPan no Android?


136

Tentei escrever um código que é usado para redimensionar os componentes da interface do usuário quando o teclado virtual é exibido. Quando uso o AdjustResize, ele redimensiona os componentes da interface do usuário e ao mesmo tempo o AdjustPan me fornece a mesma saída. Quero saber a diferença entre eles e quando usar cada componente? Qual deles (AdjustPan ou AdjustResize) é bom para redimensionar a interface do usuário?

Aqui está o meu 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 o arquivo manifesto:

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

Respostas:


237

No link Site do desenvolvedor Android

"AdjustResize"

A janela principal da atividade é sempre redimensionada para liberar espaço para o teclado virtual na tela.

"AdjustPan"

A janela principal da atividade não é redimensionada para liberar espaço para o teclado virtual. Em vez disso, o conteúdo da janela é automaticamente deslocado para que o foco atual nunca seja obscurecido pelo teclado e os usuários sempre possam ver o que estão digitando. Isso geralmente é menos desejável do que redimensionar, porque o usuário pode precisar fechar o teclado virtual para acessar e interagir com partes obscurecidas da janela.

de acordo com o seu comentário, use o seguinte no manifesto de atividade

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

1
obrigado pela sua boa resposta. Agora estou tendo um problema com minha interface do usuário. Eu tenho um edittext e um botão na parte inferior do meu layout. Quero mostrar aqueles acima do teclado virtual quando o teclado virtual aparecer. Como posso conseguir isso. Você pode me ajudar a resolver esse problema?
Androidcodehunter

1
Isso não está funcionando para mim. Na verdade, o que eu queria: eu só quero mostrar Edittext e Button acima do teclado virtual quando tento escrever algo no campo Edittext. Eu tentei sua solução, mas não estava funcionando.
Androidcodehunter

oops .. funcionou para mim .. enfim .. é possível usar o scrollview?
Stinepike

2
AdjustResize somente fornece solução quando a interface do usuário está disponível para redimensionamento, mas se eu colocar mais 5 edittext, ele não funcionará. É possível mostrar o botão e o edittext acima do teclado virtual quando a interface do usuário não estiver disponível para redimensionar. Na verdade, a questão está surgindo quando eu testei esse problema.
Androidcodehunter

1
@support_ms Por que ~ "substituir AdjustResize para AdjustPan" é necessário?
IgorGanapolsky

31

AdjustResize = redimensionar o conteúdo da página

AdjustPan = move o conteúdo da página sem redimensionar o conteúdo da página


Explicação impressionante!
Vlad

16

Também fiquei um pouco confuso entre AdjustResize e AdjustPan quando eu era iniciante. As definições dadas acima estão corretas.
AdjustResize: o conteúdo da atividade principal é redimensionado para dar espaço para entrada suave, por exemplo, teclado
AdjustPan: em vez de redimensionar o conteúdo geral da janela, ele apenas exibe o conteúdo para que o usuário possa sempre ver o que está digitando
AdjustNothing: como o nome sugere nada redimensionado ou panorâmico. O teclado é aberto, independentemente de ocultar ou não o conteúdo.

Eu criei um exemplo para uma melhor compreensão
Abaixo está o meu arquivo 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>

Aqui está a visualização de design do exemplo AdjustResize xml abaixo: Exemplo AdjustPan abaixo: Exemplo AdjustNothing abaixo:
vista original


Exemplo de AdjustResize


Exemplo de AdjustPan


AdjustNothing example


9

Como o documento diz, lembre-se da combinação correta de valores:

A configuração deve ser um dos valores listados na tabela a seguir ou uma combinação de um valor "estado ..." mais um valor "ajustar ...". A definição de vários valores em qualquer grupo - vários valores de "estado ...", por exemplo - tem resultados indefinidos. Os valores individuais são separados por uma barra vertical (|). Por exemplo:

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

não está funcionando, minha tela está por trás da entrada suave
MSD

6

Você pode usar o android:windowSoftInputMode="stateAlwaysHidden|adjustResize"AndroidManifest.xml para sua atividade atual e usar android:fitsSystemWindows="true"estilos ou rootLayout.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.