Android: Wie verhindere ich, dass die Softtastatur meine Ansicht nach oben drückt?

386

Ich habe eine vertikale Schiebeschublade am unteren Rand meiner App. Wenn sich die Softtastatur öffnet, wird die Lasche für die Schublade nach oben gedrückt, sodass sie auf der Tastatur sitzt. Ich möchte eigentlich, dass es am unteren Bildschirmrand bleibt und ausgeblendet wird, wenn die Tastatur angezeigt wird.

Ist noch jemand auf dieses Problem gestoßen? Wissen Sie, wie man es behebt?

Christopher Perry
quelle
1
Hallo, ich habe das gleiche Problem, welches Flag Sie in der Manifest-Datei verwendet haben. Können Sie mir bitte dabei helfen
?
1
Diese Frage wird hier dupliziert: stackoverflow.com/questions/5516216/…
WonderWorker

Antworten:

656

Sie können einfach das windowSoftInputModeFlag Ihrer Aktivität adjustPanin Ihrer AndroidMainfest.xmlDatei innerhalb Ihres Aktivitäts-Tags auf ändern.

Weitere Informationen finden Sie in der offiziellen Dokumentation .

<activity
   ...
   android:windowSoftInputMode="adjustPan"> 
</activity>
Alexander Oleynikov
quelle
43
Ich möchte nicht, dass die Ansicht schwenkt, ich möchte, dass sie statisch bleibt, wo sie ist, und dass die Tastatur einfach alles verdeckt, was sie verdeckt.
Christopher Perry
5
Mit Schwenken ist gemeint, dass die Ansicht gescrollt wird, um die Ansicht sichtbar zu machen, in die Sie tippen. Mit anderen Worten, wenn die gerade erschienene Tastatur die fokussierte Ansicht nicht verdeckt, bleibt sie statisch.
Alexander Oleynikov
18
Ich stehe vor dem gleichen Problem. Das windowSoftInputMode-Flag wurde in der manifesteast-Datei auf "adjustPan" gesetzt, funktioniert aber nicht. wie man es löst
Subrat
20
Hilft in meinem Fall nicht, wenn eine Reihe von Schaltflächen am unteren Bildschirmrand und eine Bildlaufansicht darüber angezeigt werden. Die Schaltflächen werden unabhängig vom Wert in windowSoftInputMode nach oben gedrückt.
Artem Russakovskii
3
nicht in einem Fragment arbeiten. Wie geht das in Fragmenten?
Prashanth Debbadwar
175

Keine der Antworten hat bei mir funktioniert, aber das hat den Trick gemacht:

android:windowSoftInputMode="adjustNothing"
Daniel Douglas
quelle
6
Dadurch wird die Tastatur über dem Inhalt angezeigt, ohne dass das Layout zur Neuberechnung der Höhe erstellt wird.
Reinherd
13
Dies löst das Problem, dass die Tastatur den Inhalt nach oben drückt, was ich und das OP erreichen wollten.
Daniel Douglas
8
Ausleihen von @Dom können Sie verwenden getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);, um diesen Wert programmgesteuert einzustellen
Bron Davies
1
Dieser funktioniert für mich im Gegensatz zu anderen Antworten (Jelly Bean 4.1)
Virus721
Perfekt! Es funktioniert auch in meinem Fall. Ich zeige einen Dialog mit einem Edittext. Sobald der Dialog geöffnet wurde, wurde auch die Tastatur angezeigt. Ich habe "adjustPan" ausprobiert, aber es hat die Funktion zum Anzeigen der Tastatur blockiert. Also hat "adjustNothing" in meinem Fall besser funktioniert.
Sembozdemir
85

In meinem Fall war der Grund, warum die Tasten nach oben gedrückt wurden, der, dass die Ansicht über ihnen a war ScrollView, und sie wurde mit den Tasten, die über der Tastatur nach oben gedrückt wurden, zusammengeklappt, unabhängig davon, welchen Wert android:windowSoftInputModeich eingestellt habe.

Ich konnte meine untere Reihe von Tasten vermeiden immer von der Soft - Tastatur , indem Sie nach oben gedrückt wird android:isScrollContainer="false"auf die , ScrollViewdie über den Tasten sitzt.

Artem Russakovskii
quelle
2
In diesem Fall bedeckt die Softtastatur einen Teil des Bildschirms und es gibt keine Möglichkeit, nach unten zu scrollen. Es gibt anscheinend nur einen Weg, um zu verhindern, dass das untere Bedienfeld oben auf der Tastatur angezeigt wird - es wird ausgeblendet, wenn die Tastatur geöffnet ist ...
Dmitry
1
Das ist es! Diese Einstellung ist meiner Meinung nach sehr interessant zu bemerken, da ich nur so die Auswirkungen der fehlenden Eigenschaft "adjustNothing" erzielen konnte!
Rupps
Ich benutze es mit Textview Working great tnx
Sunil Chaudhary
2
@Artem Russakovskii Ich weiß nicht, wer du bist, aber ich liebe dich für diese Lösung. Vielen Dank.
Lev
1
@Artem Russakovskii das funktioniert perfekt. Vielen Dank.
SkypeDogg
72

Sie können versuchen, dieses Attribut dynamisch hinzuzufügen, indem Sie den folgenden Code in die onCreateMethode Ihrer Aktivität einfügen :

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

Das hat bei mir funktioniert, aber das:

android:windowSoftInputMode="adjustPan"

nicht.

Dom
quelle
Haben Sie die android:windowSoftInputMode="adjustPan"in AndroidManifest.xml hinzugefügt ?
Habeeb Perwad
Nein, da es für mich keinen Unterschied machte. Die erste Codezeile hat den Job erledigt. :) @HabeebPerwad
Dom
Ich habe die Sekundenzeile in der Datei AndoidManifest.xml hinzugefügt. Ich denke danach hat nur noch funktioniert. also nur gefragt.
Habeeb Perwad
1
@ Dom, wie man " getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);" in einem Fragment verwendet?
Tushar Gogna
1
Schließlich! Das funktioniert! Ich hatte einen Controller (erstreckt sich von FragmentActivity) und einige Ansichten, die daran angehängt sind (die Ansichten erstrecken sich von RelativeLayout). In der schwierigen Sicht habe ich es so gemacht, controller.getWindow()...wie du es gesagt hast. Werke
Alaa M.
39

Diese Antworten hier haben mir nicht geholfen. Also habe ich das versucht:

android:windowSoftInputMode="adjustResize"

Das hat wie ein Zauber funktioniert. Jetzt verschwindet der Header meiner App nicht mehr. Es ist glatter.

amalBit
quelle
Das funktioniert bei mir fast perfekt. Das einzige Problem ist, dass die Vorschlagsleiste / -zeile der Tastatur mein Layout immer noch verbirgt. Warst du mit einem solchen Problem konfrontiert?
Sufian
Ich habe mich diesem Problem nicht gestellt. @ Sufian
AmalBit
Ich hatte damals kein Problem gehabt. Jetzt bin ich mir nicht sicher. @ Sufian
AmalBit
Für diejenigen, die möglicherweise mit ähnlichen Problemen konfrontiert sind, war dies wahrscheinlich darauf zurückzuführen TabLayout. Das Problem war behoben, als ich die Sichtbarkeit auf eingestellt hatte View.GONE. Es könnte an der Zeit sein, mein Layout neu zu gestalten.
Sufian
13

Um dies programmgesteuert in einem Fragment durchzuführen, können Sie folgenden Code verwenden

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

Platziere dies in onResume ()

ChaturaM
quelle
11

Für zukünftige Leser.

Ich wollte eine spezifische Kontrolle über dieses Problem, also habe ich Folgendes getan:

Blenden Sie in einem Fragment oder einer Aktivität Ihre anderen Ansichten aus (die bei aktivierter Tastatur nicht benötigt werden) und stellen Sie sie dann wieder her , um dieses Problem zu lösen:

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

                    }
                }
            });
Petro
quelle
1
@ Skynet Du hast absolut Recht! Dies war eine benutzerdefinierte Lösung, die ich für mein eigenes Problem verwendet habe.
Petro
7
Hey, das war großartig. Wenn jedoch die Tastatur geschlossen ist, gibt es einen kurzen Zeitraum (Millisekunden), in dem die Ansicht auf sichtbar geschaltet wird. Anstatt die Sichtbarkeit direkt view.post(Runnable runnable)einzustellen , habe ich die Sichtbarkeit von dort aus verwendet und eingestellt. Es stellte sich als großartig für mich heraus
daisura99
9

Nur eine einzige Zeile hinzugefügt werden ...

Fügen Sie die android:windowSoftInputMode="stateHidden|adjustPan"erforderliche Aktivität Ihres manifest file.

Ich wurde gerade gelöst :) :)

Sravani
quelle
8

Fügen Sie diesen Code für Xamarin-Benutzer dem Activity-Attribut der MainActivity-Klasse hinzu.

WindowSoftInputMode =Android.Views.SoftInput.AdjustNothing

oder Sie können diesen Code Window.SetSoftInputMode(Android.Views.SoftInput.AdjustNothing)zur OnCreate-Methode der MainActivity-Klasse hinzufügen.

Tushar Patel
quelle
8

Dieser hat für mich gearbeitet

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);
Suresh Pattu
quelle
7

Bisher haben mir die Antworten nicht geholfen, da ich eine Schaltfläche und ein textInput-Feld (nebeneinander) unter der textView habe, die immer wieder von der Tastatur ausgeblendet wurden, aber dies hat mein Problem gelöst:

android:windowSoftInputMode="adjustResize"
Michael McDowell
quelle
7

Fügen Sie der 'Aktivität' der Manifest-Datei folgenden Code hinzu.

android:windowSoftInputMode="adjustResize"
Jose Kurian
quelle
Das funktioniert gut. Nur um zu raten, es funktioniert jedoch nicht gut, wenn Sie Prozent verwenden. Weil es einige Elemente neu justiert. Wenn Sie also Constraints-Elemente mit Prozent haben, haben Sie ein Problem. Verwenden Sie stattdessen wrap_content und es wird sehr gut funktionieren.
Thiago Silva
7
android:windowSoftInputMode="stateHidden|adjustNothing"

Dieser Code funktioniert.

AmyShamna
quelle
Ich denke android: windowSoftInputMode = "stateHidden | adjustPan" sollte auch funktionieren.
Arthur Sady Cordeiro Rossetti
6

Dies war das Beste, was für mich funktioniert hat

android:windowSoftInputMode="adjustNothing"

Versuch es!

rajlaxmi_jagdale
quelle
4

Nun, ich habe diese Antworten gesehen, aber in meinem Fall bin ich in das gleiche Problem geraten und habe Zuflucht durch eine sehr praktische und einfachste Lösung gefunden, bei der ein sehr kleines unschuldiges Attribut in Ihr Scrollview-Tag eingefügt wird, das sich in Ihrer XML-Datei befindet. Das ist

android:isScrollContainer="false"

Viel Glück!

Ali Nawaz
quelle
4
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

Dieser arbeitet für mich.

Zhang Slardar
quelle
2

Für die Bildlaufansicht:

wenn nach dem Hinzufügen android:windowSoftInputMode="stateHidden|adjustPan"in Ihrem Android-Manifest und immer noch nicht funktioniert.

Dies kann betroffen sein, da sich die Tastatur beim Anzeigen in einer Bildlaufansicht befindet. Wenn sich Ihre Schaltfläche / Objekte nicht in Ihrer Bildlaufansicht befinden, folgen die Objekte der Tastatur und verschieben ihre Position.

Überprüfen Sie Ihre XML-Datei, in der sich Ihre Schaltfläche befindet, und stellen Sie sicher, dass sie sich unter Ihrer Bildlaufansicht befindet und nicht außerhalb der Schaltfläche.

Hoffe das hilft. : D.

Yils
quelle
2

In meinem Fall musste die Tastatur ausgeblendet bleiben und kurz nach dem Klicken auf die Schaltfläche musste mein Layout angepasst werden. Deshalb habe ich diesen Befehl einfach in das Manifest eingefügt und es wurde super richtig.

android:windowSoftInputMode="stateHidden|adjustResize"
Rafael Rodrigues
quelle
2

Wenn Sie die Ansicht beim Öffnen der Tastatur ausblenden möchten.

Fügen Sie dies Ihrer Aktivität in Manifestdatei hinzu

android:windowSoftInputMode="stateHidden|adjustPan"
Hakim Khan
quelle
2

Keiner von ihnen hat für mich gearbeitet, probieren Sie diesen aus

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

            }
        }
    });

}
Saljith Kj
quelle
1

Die Größe des Hauptfensters der Aktivität wird nicht geändert, um Platz für die Softtastatur zu schaffen. Der Inhalt des Fensters wird automatisch verschoben, sodass der aktuelle Fokus nie durch die Tastatur verdeckt wird und Benutzer immer sehen können, was sie eingeben.

android:windowSoftInputMode="adjustPan"

Dies könnte eine bessere Lösung für das sein, was Sie gewünscht haben.

user3243900
quelle
1

Versuchen Sie dies zu verwenden:

android:windowSoftInputMode="stateHidden|adjustPan"
Ashish Gautam
quelle
1

Dieser Code kann Ihnen helfen. Verwenden Sie es in Ihrer oncreateMethode.

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
Shiv Prakash Yadav
quelle
Ich habe es versucht, aber ich habe Probleme, bei denen die Ansicht einen Teil des unteren Teils der Ansicht abschneidet und die Ansicht verschiebt, um die oben angegebene Zeit zu überlagern. Irgendwelche Ideen, welches Layout sich ändert oder was benötigt wird? stackoverflow.com/questions/39909897/…
Lion789
1

Fügen Sie in Ihre Manifestdatei eine Aktivität ein, die Sie anzeigen möchten. Stellen Sie jedoch sicher, dass Sie keine Vollbildaktivität verwenden

android:windowSoftInputMode="adjustPan"
user3419461
quelle
1

@manifest in Ihrer Tätigkeit:

android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
Juan Mendez
quelle
1

Ich habe mein Problem durch Hinzufügen gelöst

 android:windowSoftInputMode="adjustNothing" 

In Manifestdatei hinzufügen.

und die Recyclerviews-Einschränkung isScrollContainer auf false zu setzen.

android:isScrollContainer="false"
MILLIONEN GASHAW
quelle