Mover layouts para cima quando o teclado virtual é exibido?


139

Eu tenho alguns elementos em um RelativeView com o atributo de alinhamento inferior definido, quando o teclado virtual aparece, os elementos são ocultados pelo teclado virtual.

Eu gostaria que eles subissem para que, se houver espaço suficiente na tela, eles sejam mostrados acima do teclado, ou tornem a seção acima do teclado rolável para que o usuário ainda possa ver os elementos.

Alguma idéia de como abordar isso?


Referência atualizada do blog de desenvolvedores
Jayabal 22/10/12

@Dinedal Como você define alinhar o atributo bottom como ur RelativeView ???
precisa saber é o seguinte

Respostas:



95

Você também pode usar este código no onCreate()método:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

11
Para mim, mesmo se eu definir movimento adjustPan screnn somente até edição de texto que eu cliquei, mas não todo o layout
murt


22

Faça alterações na atividade do seu arquivo de manifesto, como

windowSoftInputMode="adjustResize"

OU

Faça alterações no seu onCreate()método na classe de atividade como

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

11
Por que você usa sinalizadores diferentes?
CoolMind 17/10/19

A versão atual requer o prefixo android: android: windowSoftInputMode = "AdjustResize"
Andrea Leganza

21

problema semelhante que eu estava enfrentando com o meu layout, que consiste na exibição de rolagem dentro. Sempre que tento selecionar texto no EditText, a barra de ação Copiar / Cortar / Colar é movida para cima com o código abaixo, pois não redimensiona o layout

android:windowSoftInputMode="adjustPan"

Modificando-o como abaixo

1) AndroidManifest.xml

android:windowSoftInputMode="stateVisible|adjustResize"

2) arquivo style.xml, no estilo de atividade

<item name="android:windowActionBarOverlay">true</item>

Funcionou.!!!!!!!!!!!!


18

No AndroidManifest.xml, não se esqueça de definir:

 android:windowSoftInputMode="adjustResize"

e para RelativeLayout dentro de ScrollView, defina:

 android:layout_gravity="center" or android:layout_gravity="bottom" 

tudo vai dar certo


android: layout_gravity = "center" funcionou, obrigado! :) agora EditText se move sobre o teclado como eu queria
Pavel Biryukov

11

for Activity em sua inserção de método oncreate abaixo da linha

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

e para fragmentos em seu método onCreate

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

10

Existem três etapas a seguir para rolar a tela para cima.

  1. Escreva no arquivo de manifesto para sua atividade:

android: windowSoftInputMode = "AdjustResize"

  1. Adicione a seguinte linha no método oncreate () da sua atividade

getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

  1. Em seguida, coloque toda a sua exibição em "Scrollview" no arquivo XML, como:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:background="@drawable/bg"
    android:layout_height="match_parent" 
    > 
    <RelativeLayout
         android:layout_width="fill_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center" >
        <TextView />
         .........
        <TextView />
        <EditText >
            <requestFocus />
        </EditText>
        <Button />
    </RelativeLayout>
 </ScrollView>

PS Não esqueça de adicionar o android: layout_gravity = "center" no layout relativo dos pais.


6

Eu tentei um método de Diego Ramírez, funciona. No AndroidManifest:

    <activity
        android:name=".MainActivity"
        android:windowSoftInputMode="stateHidden|adjustResize">
        ...
    </activity>

Em activity_main.xml:

<LinearLayout ...
    android:orientation="vertical">

<Space
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1" />

<EditText
    android:id="@+id/edName"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:hint="@string/first_name"
    android:inputType="textPersonName" />

<EditText ...>
...
</LinearLayout>

6
<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

Adicione NestedScrollView ao redor do layout que você deseja rolar, isso funcionará perfeitamente


3

Eu encontrei uma solução para meus problemas que é praticamente a mesma que a sua.

Primeiro de tudo, eu só tenho um LinearLayout com 2 elementos, um ImageView e um LinearLayout que contêm 2 EditText e um Button, então eu precisava mantê-los separados em tela cheia sem teclado, e quando o teclado aparecer, eles deverão parecer mais próximos.

Então, adicionei a visualização entre eles com o atributo height em 0dp e weight 1, que permite manter minhas visualizações separadas uma da outra. e quando o teclado aparece, como eles não têm uma altura fixa, eles apenas redimensionam e mantêm o aspecto.

Voila! O redimensionamento do layout e a distância entre minhas visualizações são as mesmas quando o teclado está ou não presente.


6
Por que você não publica o código, para melhor compreensão?
31420 John Mayer

Publiquei um código de exemplo acima: stackoverflow.com/a/31994697/2914140 .
CoolMind 17/10/19

você pode conseguir isso de uma maneira menos invasiva usando ConstraintLayoute fixando uma seção superior na parte superior e uma seção inferior na parte inferior. Quando o teclado é aberto, ele é redimensionado naturalmente, espremendo o espaço no meio (se você usar adjustResize)
hmac 14/01

2
If user want this task using manifest then add this line in manifest
In manifest add this line: - android:windowSoftInputMode="adjustPan"
    e.g.
     <activity
           android:name=".ui.home.HomeActivity"
           android:screenOrientation="portrait"
           android:windowSoftInputMode="adjustPan">
     </activity>


    In Java File or Kotlin File(Programically) : - If user want this using Activity then add below line in onCreate Method

    activity!!.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

Olá e bem-vindo ao stackoverflow, e obrigado pela sua resposta. Em vez de apenas postar um bloco de código, você pode dar uma breve explicação sobre qual é o problema que você resolveu e como o resolveu? Isso ajudará as pessoas que encontrarem essa questão no futuro a entender melhor o problema e como lidar com ele.
Plutian

1

Aqui está o código completo do manifesto

<activity
        android:name=".activities.MainActivity"
        android:windowSoftInputMode="adjustResize"
        android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

1

se você estiver em fragmentos, precisará adicionar o código abaixo ao seu onCreate na sua atividade que resolve o problema para mim

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

1

No seu arquivo de manifesto, adicione a linha abaixo. Vai funcionar

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

1

Acabei de adicionar a seguinte linha ao layout de nível superior e tudo funcionou:

android:fitsSystemWindows="true"

@ yash786 é possível mostrar o botão abaixo do edittext que recebe um foco? Segunda pergunta, você pode compartilhar seu arquivo de layout ou me responder como você adiciona o edittext à parte superior do teclado?
Heroes84

funciona para mim evento sem android: windowSoftInputMode = "stateVisible | AdjustResize"
zoom

0

Tudo bem, isso é muito tarde, no entanto, eu descobri que, se você adicionar uma Visualização de lista ao seu texto de edição, o teclado moverá todos os layouts nesse edittext sem mover o ListView

<EditText
android:id="@+id/et"
android:layout_height="match_parent"
android:layout_width="match_parent"



/>

<ListView
    android:layout_width="match_parent"
    android:layout_height="match_parent"//can make as 1dp
    android:layout_below="@+id/et" // set to below editext
    android:id="@+id/view"
    >
**<any layout**

Esta é a única solução que funcionou para mim.


0

Nem um único conselho resolve meu problema. Ajustar Pan é quase como o trabalho Ajustar Redimensionar . Se eu definir Ajustar nada, o layout não será movido para cima, mas ocultará meu texto de fundo que estou escrevendo corretamente. Então, após 24 horas de pesquisa contínua, encontrei essa fonte e ela resolveu meu problema.


0

Pode ser tarde, mas quero acrescentar algumas coisas. No Android Studio Versão 4.0.1 e Gradle Versão 6.1.1, o windowSoftInputMode não funcionará conforme o esperado se você estiver adicionando os seguintes sinalizadores em sua Atividade:

getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,
                WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS
        );

Depois de perder muito tempo, encontrei esse truque. Para que adjustResizeou AdjustPanou qualquer atributo de windowSoftInputModefuncione corretamente, você precisa removê-lo da sua atividade.

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.