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?

Dinedal
fonte
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);
Bobs
fonte
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
33

Adicione AndroidManifest.xml à sua atividade:

android:windowSoftInputMode="adjustPan|adjustResize"
Serhii Bohutskyi
fonte
22
De acordo com a documentação, o comportamento não é especificado se você usar dois sinalizadores "ajustar ..." aqui. Consulte developer.android.com/guide/topics/manifest/…
user1806772
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);
Jose Kurian
fonte
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.!!!!!!!!!!!!

Ronak Poriya
fonte
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

Zahra.HY
fonte
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);
Rahul_Pawar
fonte
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.

Heena Arora
fonte
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>
CoolMind
fonte
6
<activity name="ActivityName"
    android:windowSoftInputMode="adjustResize">
    ...
</activity>

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

Prakash Reddy
fonte
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.

Diego Ramírez Vásquez
fonte
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);
safal bhatia
fonte
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>
Dantalian
fonte
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);
Pratik Mohanrao Gondil
fonte
1

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

<activity name="MainActivity"
    android:windowSoftInputMode="stateVisible|adjustResize">
    ...
</activity>
Shivam Garg
fonte
1

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

android:fitsSystemWindows="true"
Darush
fonte
@ 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.

Omar Boshra
fonte
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.

Mahbubur Rahman Khan
fonte
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.

Shehryar Aɱɩŋ
fonte