Rolagem de página quando o teclado virtual apareceu

99

Eu tenho um <ScrollView>layout:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_scrollview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <EditText
            android:id="@+id/input_one"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:inputType="number" >

         <EditText
            android:id="@+id/input_two"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:inputType="number" >

         <EditText
            android:id="@+id/input_three"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:inputType="number" >

          <Button
            android:id="@+id/ok_btn"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="20dp"
            android:text="@string/ok_str" />

      </LinearLayout>
</ScrollView>

Como você pode ver acima, o layout simples consiste em três campos de entrada e um botão "Ok".

Eu executo meu aplicativo com o layout acima, quando toco no primeiro campo de entrada ( @+id/input_one), o teclado virtual aparecerá na parte inferior da tela, ele oculta o terceiro campo de entrada e o botão "Ok".

Desde que eu uso <ScrollView>, pensei que posso rolar a página para cima para ver o terceiro campo de entrada e o botão "Ok" que estão ocultos pelo teclado virtual, mas a página não é rolável . Por quê? Como me livrar disso? basicamente, gostaria de ver todos os campos de entrada e o botão "Ok", até mesmo o teclado virtual aparecer.

Leem.fin
fonte
1
remova o <ScrollView>, LinearLayout deve ser seu layout externo, ele funcionará, espero que mesmo se o sofkeyboard aparecer.
Abid A. Chaudhary,
1
@pakshaheen Isso não resolverá o problema quando o scrollview for necessário.
Luten
aqui está o código de trabalho. stackoverflow.com/questions/7417123/…
Venkat

Respostas:

125

Corrigi o problema definindo o seguinte atributo em <activity>de AndroidManifest.xml

android:windowSoftInputMode="adjustResize"
Leem.fin
fonte
12
Você não precisa do stateVisible. Isso fará com que o teclado
virtual
é um teclado aberto automaticamente, mesmo que não haja texto de edição
Sr. X
37

Ok, já procurei por várias horas para encontrar o problema e o encontrei.

Nenhuma das mudanças gostou fillViewport="true"ou android:windowSoftInputMode="adjustResize"me ajudou.

Eu uso o Android 4.4 e este é o grande erro :

android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"

De alguma forma, os temas Fullscreen evitam que os ScrollViews rolem quando o SoftKeyboard estiver visível.

No momento, acabei usando isso:

android:theme="@android:style/Theme.Black.NoTitleBar

Não sei como me livrar da barra superior do sistema com a hora e a exibição da bateria, mas pelo menos entendi o problema.

Espero que isso ajude outras pessoas que tenham o mesmo problema.

EDIT: Eu tenho uma pequena solução alternativa para o meu caso, então eu postei aqui :

Não tenho certeza se isso vai funcionar para você, mas com certeza vai ajudá-lo a entender e esclarecer algumas coisas.

EDIT2: Aqui está mais um bom tópico que vai te ajudar a ir na direção certa ou até mesmo resolver seu problema.

Qweret
fonte
+1 No meu caso, a barra de status foi escondida por uma biblioteca de terceiros no código: getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
de.
@qweret E se eu precisar dos dois? Tela inteira e rolagem.
Prabs de
@Prabs Você encontrou alguma solução? Também quero Tela inteira e rolagem.
Johny
@Johny Nope. Por enquanto, estou usando a tela inteira para todo o aplicativo, exceto aquela atividade com scrolling3.
Prabs de
@Prabs A única solução que pensei é ter uma barra de status transparente, mas no meu caso ainda é um problema porque quero oferecer suporte a API> = 16. Você tem alguma ideia?
Johny
20

Para mim a única coisa que funciona é colocar na atividade no manifesto este atributo:

android:windowSoftInputMode="stateHidden|adjustPan"

Para não mostrar o teclado ao abrir a atividade e não sobrepor a parte inferior da visualização.

Jachumbelechao Unto Mantekilla
fonte
14

coloque isso dentro de seu manifesto como este em modo sem tela cheia

android:windowSoftInputMode="stateVisible|adjustPan" 

em seu manifesto

<activity
    android:windowSoftInputMode="stateVisible|adjustPan"
    android:name="com.example.patronusgps.MainActivity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
user3594530
fonte
1
Eu tentei isso, mas sem sucesso, sem sorte ... No entanto, a visualização da raiz não é a ScrollView, mas a RelativeLayoutque contém a LinearLayoutque contém aScrollView
James Heald
11

Em sua propriedade Manifestdefinir windowSoftInputMode:

<activity android:name=".MyActivity"
          android:windowSoftInputMode="adjustNothing">
Mohammad Ersan
fonte
2
@JacobRas, verifique este link: developer.android.com/reference/android/… tem o valor "AdjustNothing" :)
Mohammad Ersan
2
Tenho o mesmo problema, mas o scrollview não funciona com o ajusteNothing :(
Narendra Singh
8

Veja isso.

<activity android:name=".Calculator"
    android:windowSoftInputMode="stateHidden|adjustResize" 
    android:theme="@android:style/Theme.Black.NoTitleBar">
</activity>
Ravi1187342
fonte
3

Isso só funcionou para mim:

android:windowSoftInputMode="adjustPan"
blueware
fonte
2

Além disso, se você quiser fazer isso programaticamente, basta adicionar a linha abaixo ao onCreate da atividade.

getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE | 
            WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE );
ucMedia
fonte
1

Você pode tentar usar o seguinte código para resolver seu problema:

 <activity
     android:name=".DonateNow"
     android:label="@string/title_activity_donate_now"
     android:screenOrientation="portrait"
     android:theme="@style/AppTheme"
     android:windowSoftInputMode="stateVisible|adjustPan">
 </activity>
Энхжин Амарсайхан
fonte
17
Você deve se incomodar em explicar o que seu código faz em vez de apenas postar um código simples como resposta.
Angel Politis
0

bem, a resposta mais simples que tentei é apenas remover seu código, o que faz a atividade ficar em tela cheia. Eu tinha um código como este que era responsável por fazer minha atividade ir para tela cheia:

if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.KITKAT) {

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

Acabei de remover meu código e ele funciona perfeitamente bem, embora se você quiser fazer isso com a tela inteira ligada, você terá que tentar alguns outros métodos

Akash Gupta
fonte