Android: come posso impedire alla tastiera virtuale di aumentare la visualizzazione?


386

Ho un cassetto scorrevole verticale nella parte inferiore della mia app. Quando la tastiera virtuale si apre, spinge verso l'alto la linguetta del cassetto, quindi si trova sulla tastiera. In realtà voglio che rimanga nella parte inferiore dello schermo, diventando nascosto quando viene mostrata la tastiera.

Qualcun altro ha riscontrato questo problema? Sai come ripararlo?


1
ciao, sto riscontrando lo stesso problema con quale flag hai usato nel file manifest, puoi aiutarmi con questo
Nixit Patel,

1
Questa domanda è duplicata qui: stackoverflow.com/questions/5516216/…
WonderWorker

Risposte:


656

Puoi semplicemente cambiare il windowSoftInputModeflag della tua attività adjustPannel tuo AndroidMainfest.xmlfile all'interno del tag attività.

Controlla la documentazione ufficiale per maggiori informazioni.

<activity
   ...
   android:windowSoftInputMode="adjustPan"> 
</activity>

43
Non voglio che la vista si sposti, voglio che rimanga statica dov'è, e ho solo la tastiera che copre tutto ciò che coprirà.
Christopher Perry,

5
Per panning si intende che la vista verrà fatta scorrere per rendere visibile quella vista a cui si sta digitando. In altre parole, se la tastiera appena visualizzata non coprisse la vista focalizzata, rimarrebbe statica.
Alexander Oleynikov,

18
Sono di fronte allo stesso problema. fatto il flag windowSoftInputMode su "AdjustPan" in manifeast file.but non funzionante. come risolverlo
Subrat

20
Non aiuta nel mio caso di avere una fila di pulsanti nella parte inferiore dello schermo e uno ScrollView sopra di essi. I pulsanti vengono spinti verso l'alto, indipendentemente dal valore in windowSoftInputMode.
Artem Russakovskii,

3
non funziona in un frammento. Come farlo in frammento?
Prashanth Debbadwar,

175

Nessuna delle risposte ha funzionato per me, ma questo ha funzionato:

android:windowSoftInputMode="adjustNothing"

6
Questo fa apparire la tastiera sovrapponendo il contenuto, senza creare layout per ricalcolare la sua altezza.
Reinherd,

13
Questo risolve il problema della tastiera, spingendo il contenuto verso l'alto, ma che è ciò che io e l'OP volevamo raggiungere.
Daniel Douglas,

8
prendendo in prestito da @Dom è possibile utilizzare getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);per impostare questo valore a livello di codice
Bron Davies,

1
Questo funziona per me, a differenza di altre risposte (jelly bean 4.1)
Virus721

Perfetto! Funziona anche nel mio caso. Sto mostrando una finestra di dialogo con all'interno un edittext. Non appena si apre la finestra di dialogo, appariva anche la tastiera. Ho provato "AdjustPan", ma ha bloccato la funzione di visualizzazione della tastiera. Quindi, "adjustNothing" ha funzionato meglio nel mio caso.
sembozdemir,

85

Nel mio caso, la ragione per cui i pulsanti sono stati spinti in su era perché la vista sopra di loro era a ScrollView, ed era collassata con i pulsanti spinti in alto sopra la tastiera, indipendentemente dal valore android:windowSoftInputModeche stavo impostando.

Sono stato in grado di evitare che la mia fila di pulsanti in basso venisse spinta dalla tastiera soft impostando android:isScrollContainer="false"quella ScrollViewche si trova sopra i pulsanti.


2
Ma in questo caso la tastiera software copre parte dello schermo e non c'è modo di scorrere verso il basso. Sembra che ci sia un solo modo per impedire che il pannello inferiore venga visualizzato nella parte superiore della tastiera - nasconderlo quando la tastiera è aperta ...
Dmitry

1
questo è! Questa impostazione è a mio avviso molto interessante da notare, in quanto è l'unico modo che ho trovato per ottenere gli effetti della proprietà mancante "AdjustNothing"!
Rupps

Lo uso con Textview Working great tnx
Sunil Chaudhary,

2
@Artem Russakovskii Non so chi sei, ma ti amo per questa soluzione. Molte grazie.
Lev

1
@Artem Russakovskii funziona perfettamente. Molte grazie.
SkypeDogg,

72

Puoi provare ad aggiungere questo attributo in modo dinamico, inserendo il seguente codice nel onCreatemetodo della tua attività:

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

Questo ha funzionato per me, ma che:

android:windowSoftInputMode="adjustPan"

di poco.


Hai aggiunto il file android:windowSoftInputMode="adjustPan"in AndroidManifest.xml?
Habeeb Perwad,

No, dato che non ha fatto alcuna differenza per me. La prima riga di codice ha fatto il lavoro. :) @HabeebPerwad
Dom

Ho aggiunto la riga dei secondi nel file AndoidManifest.xml. Penso che solo dopo abbia funzionato. così appena chiesto.
Habeeb Perwad,

1
@Dom, come usare " getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);" in un frammento?
Tushar Gogna,

1
Finalmente! Questo funziona! Avevo un controller (si estende da FragmentActivity) e alcune viste associate (le viste si estendono da RelativeLayout). Quindi, dal punto di vista fastidioso, mi è controller.getWindow()...piaciuto come hai detto. Opere
Alaa M.

39

Queste risposte qui non mi hanno aiutato. Quindi ho provato questo:

android:windowSoftInputMode="adjustResize"

Funzionava come un incantesimo, ora l'intestazione della mia app non scompare. È più liscio.


Questo funziona quasi perfettamente per me. L'unico problema è che la barra / riga dei suggerimenti della tastiera nasconde ancora il mio layout. Hai affrontato un problema del genere?
Sufian,

Non ho affrontato questo problema. @Sufian
amalBit

Allora non avevo affrontato alcun problema. Adesso non ne sono sicuro. @Sufian
amalBit

Per coloro che potrebbero affrontare problemi simili, probabilmente era dovuto a TabLayout. Il problema era scomparso una volta impostato su Visibilità View.GONE. Potrebbe essere il momento di ridisegnare il mio layout.
Sufian,

13

Per farlo a livello di codice in un frammento è possibile utilizzare il seguente codice

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

Metti questo in onResume ()


11

Per i futuri lettori.

Volevo un controllo specifico su questo problema, quindi è quello che ho fatto:

Da un frammento o attività, nascondi le altre viste (che non sono necessarie mentre la tastiera è in alto), quindi ripristinali per risolvere questo problema:

            rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    Rect r = new Rect();
                    rootView.getWindowVisibleDisplayFrame(r);
                    int heightDiff = rootView.getRootView().getHeight() - (r.bottom - r.top);

                    if (heightDiff > 100) { // if more than 100 pixels, its probably a keyboard...
                    //ok now we know the keyboard is up...
                        view_one.setVisibility(View.GONE);
                        view_two.setVisibility(View.GONE);

                    }else{
                    //ok now we know the keyboard is down...
                        view_one.setVisibility(View.VISIBLE);
                        view_two.setVisibility(View.VISIBLE);

                    }
                }
            });

1
@Skynet Hai perfettamente ragione! Questa era una soluzione personalizzata che ho usato per il mio problema.
Petro,

7
Ehi, è stato geniale. Tuttavia, nell'istanza in cui la tastiera è chiusa, c'è un breve periodo (millisecondi) in cui la vista diventa visibile. Quindi, invece di impostare direttamente la visibilità, ho usato view.post(Runnable runnable)e impostato la visibilità da lì. Si è rivelato fantastico per me
daisura99,

9

Solo una singola riga da aggiungere ...

Aggiungi l' android:windowSoftInputMode="stateHidden|adjustPan"attività richiesta del tuo manifest file.

Mi sono appena risolto :) :)


8

Per gli utenti di xamarin aggiungere questo codice all'attributo Activity della classe MainActivity,

WindowSoftInputMode =Android.Views.SoftInput.AdjustNothing

oppure puoi aggiungere questo codice Window.SetSoftInputMode(Android.Views.SoftInput.AdjustNothing)al metodo OnCreate della classe MainActivity.


8

Questo ha funzionato per me

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

7

Finora le risposte non mi sono state di aiuto in quanto ho un pulsante e un campo textInput (fianco a fianco) sotto il textView che continuava a essere nascosto dalla tastiera, ma questo ha risolto il mio problema:

android:windowSoftInputMode="adjustResize"

7

Aggiungi il seguente codice all '' attività 'del file manifest.

android:windowSoftInputMode="adjustResize"

Funziona bene Tuttavia, solo per consigli, non funziona bene quando si utilizza la percentuale. Perché riaggiusta alcuni elementi. Quindi, se hai elementi Vincoli con percentuale, avrai un problema. Usa invece wrap_content e funzionerà molto bene.
Thiago Silva,


6

Questo è stato il migliore che ha funzionato per me

android:windowSoftInputMode="adjustNothing"

Provalo!


4

Bene, ho visto queste risposte, ma nel mio caso sono caduto nello stesso problema e mi sono rifugiato attraverso una soluzione molto pratica e più semplice che prevede l'inserimento di un attributo innocuo molto piccolo nel tag Scrollview che risiede nel tuo file XML. Questo è

android:isScrollContainer="false"

In bocca al lupo!


4
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

Questo funziona per me.


2

Per la vista di scorrimento:

se dopo aver aggiunto il android:windowSoftInputMode="stateHidden|adjustPan"tuo manifest Android e ancora non funziona.

Potrebbe essere interessato perché quando appare la tastiera, si troverà in una vista di scorrimento e se il pulsante / qualsiasi oggetto non è nella vista di scorrimento, gli oggetti seguiranno la tastiera e ne sposteranno la posizione.

Controlla il tuo xml dove si trova il tuo pulsante e assicurati che sia sotto la parentesi di scorrimento Visualizza e non fuori di esso.

Spero che questo aiuti. : D


2

Nel mio caso avevo bisogno che la tastiera rimanesse nascosta e subito dopo il clic del pulsante il mio layout doveva essere regolato, quindi ho appena aggiunto questo comando nel manifest e ha funzionato perfettamente.

android:windowSoftInputMode="stateHidden|adjustResize"

2

Quando si desidera nascondere la vista quando si apre la tastiera.

Aggiungi questo nella tua attività nel file manifest

android:windowSoftInputMode="stateHidden|adjustPan"

2

Nessuno di loro ha funzionato per me, prova questo

 private void scrollingWhileKeyboard() {
    drawerlayout.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {

            Rect r = new Rect();
            try {
                drawerlayout.getWindowVisibleDisplayFrame(r);
                int screenHeight = drawerlayout.getRootView().getHeight();
                int keypadHeight = screenHeight - r.bottom;
                if (keypadHeight > screenHeight * 0.15) {
                    tabLayout.setVisibility(View.GONE);
                } else {
                    tabLayout.setVisibility(View.VISIBLE);
                }
            } catch (NullPointerException e) {

            }
        }
    });

}

1

La finestra principale dell'attività non verrà ridimensionata per fare spazio alla tastiera virtuale. Piuttosto, il contenuto della finestra verrà automaticamente spostato in modo che la messa a fuoco corrente non venga mai oscurata dalla tastiera e gli utenti possano sempre vedere ciò che stanno digitando.

android:windowSoftInputMode="adjustPan"

Questa potrebbe essere una soluzione migliore per ciò che desideri.


1

Prova ad usare questo:

android:windowSoftInputMode="stateHidden|adjustPan"

1

Questo codice può aiutarti. Usalo nel tuo oncreatemetodo.

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

Ho provato questo, ma ho problemi in cui la vista interrompe un po 'la parte inferiore della vista e spinge la vista per sovrapporre il tempo sopra? Qualche idea su quale layout cambia o cosa è necessario? stackoverflow.com/questions/39909897/...
Lion789

1

Includi nel tuo file manifest sotto l'attività che desideri visualizzare. Ma assicurati di non utilizzare l'attività a schermo intero

android:windowSoftInputMode="adjustPan"

1

@manifest nella tua attività:

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"

1

Ho risolto il mio problema aggiungendo

 android:windowSoftInputMode="adjustNothing" 

Nel file manifest aggiungere.

e rendendo il vincolo di Recyclerviews isScrollContainer su false.

android:isScrollContainer="false"
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.