Scorri la pagina quando viene visualizzata la tastiera virtuale


99

Ho un <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>

Come vedete sopra, il layout semplice consiste di tre campi di input e un pulsante "Ok".

Eseguo la mia app con il layout sopra, quando tocco il primo campo di input ( @+id/input_one), la tastiera virtuale apparirà dalla parte inferiore dello schermo, nasconde il terzo campo di input e il pulsante "Ok".

Da quando lo uso <ScrollView>, ho pensato di poter scorrere la pagina verso l'alto per vedere il 3 ° campo di input e il pulsante "Ok" che sono nascosti dalla tastiera virtuale, ma la pagina non è scorrevole . Perché? Come sbarazzarsene? fondamentalmente, vorrei vedere tutti i campi di input e il pulsante "Ok", anche la tastiera virtuale spuntata.


1
rimuovi il <ScrollView>, LinearLayout dovrebbe essere il tuo layout esterno, funzionerà, spero anche se la sofkeyboard si apre.
Abid A. Chaudhary

1
@pakshaheen Questo non risolverà il problema quando è richiesto scrollview.
Luten

Risposte:


125

Ho risolto il problema definendo il seguente attributo in <activity>di AndroidManifest.xml

android:windowSoftInputMode="adjustResize"

12
Non hai bisogno di stateVisible. Ciò farà apparire la tastiera virtuale all'avvio dell'app anche quando l'utente non è concentrato su un EditText
RajV

è una tastiera automaticamente aperta anche se non c'è testo modificato
Mr X

37

Ok, ho cercato diverse ore per trovare il problema e l'ho trovato.

Nessuno dei cambiamenti mi piace fillViewport="true"o android:windowSoftInputMode="adjustResize"mi ha aiutato.

Uso Android 4.4 e questo è il grosso errore :

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

In qualche modo, i temi a schermo intero impediscono lo scorrimento di ScrollView quando la SoftKeyboard è visibile.

Al momento, ho finito per usare questo invece:

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

Non so come sbarazzarmi della barra di sistema superiore con l'ora e la visualizzazione della batteria, ma almeno ho avuto il problema.

Spero che questo aiuti altri che hanno lo stesso problema.

EDIT: ho una piccola soluzione alternativa per il mio caso, quindi l'ho pubblicato qui :

Non sono sicuro che questo funzionerà per te, ma sicuramente ti aiuterà a capire e chiarire alcune cose.

EDIT2: Ecco un altro buon argomento che ti aiuterà ad andare nella giusta direzione o addirittura a risolvere il tuo problema.


+1 Nel mio caso la barra di stato era nascosta da una libreria di terze parti nel codice: getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
de.

@qweret E se avessi bisogno di entrambi? Schermo intero e scorrimento.
Prabs

@Prabs Hai trovato qualche soluzione? Voglio anche sia Schermo intero che scorrimento.
Johny

@ Johny No. Per ora sto utilizzando lo schermo intero per l'intera app tranne che per l'attività con scorrimento3.
Prabs

@Prabs L'unica soluzione che ho pensato è avere una barra di stato trasparente, ma nel mio caso è ancora un problema perché voglio supportare API> = 16. Hai qualche idea?
Johny

20

Per me l'unica cosa che funziona è mettere nell'attività nel manifesto questo attributo:

android:windowSoftInputMode="stateHidden|adjustPan"

Per non mostrare la tastiera all'apertura dell'attività e non sovrapporre la parte inferiore della visualizzazione.


14

mettilo nel tuo Manifest in questo modo in No fullscreen Mode

android:windowSoftInputMode="stateVisible|adjustPan" 

nel tuo manifest

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

1
L'ho provato ma sfortunatamente, senza fortuna ... Tuttavia, la vista radice non è una ScrollView, ma una RelativeLayoutche contiene una LinearLayoutche poi contiene unScrollView
James Heald


8

controlla questo.

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

3

Questo ha funzionato solo per me:

android:windowSoftInputMode="adjustPan"

2

Inoltre, se vuoi farlo in modo programmatico, aggiungi la riga sottostante a onCreate dell'attività.

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

1

Puoi provare a utilizzare il seguente codice per risolvere il tuo problema:

 <activity
     android:name=".DonateNow"
     android:label="@string/title_activity_donate_now"
     android:screenOrientation="portrait"
     android:theme="@style/AppTheme"
     android:windowSoftInputMode="stateVisible|adjustPan">
 </activity>

17
Dovresti preoccuparti di spiegare cosa fa il tuo codice invece di pubblicare semplicemente un codice a secco come risposta.
Angel Politis

0

beh, la risposta più semplice che ho provato è semplicemente rimuovere il codice che rende l'attività a schermo intero.Ho avuto un codice come questo che era responsabile per rendere la mia attività a schermo intero:

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

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

ho appena rimosso il mio codice e funziona perfettamente anche se se vuoi ottenere questo risultato con lo schermo intero attivo, dovrai provare altri metodi

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.