Gibt es eine Möglichkeit, den Wert von android: windowSoftInputMode aus der Java-Klasse zu ändern?

82

Ich möchte meine Registerkarten so bearbeiten, dass sie windowSoftInputModefür jede Registerkarte unterschiedliche Eigenschaften haben. Wie kann ich von der Java-Klasse aus auf diese Eigenschaft zugreifen, wenn die gesamte Bearbeitung Ihrer Registerkarte von einer einzigen Aktivität aus erfolgt?

Gibt es eine Möglichkeit, über Java-Code auf diese Manifest-Eigenschaft zuzugreifen?

Prasham
quelle

Antworten:

124

Verwenden Sie Folgendes, um den softInputMode für eine Aktivität zu ändern.

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

Verwenden Sie Folgendes, um den softInput-Typ für einen EditText zu ändern.

mEditText.setImeOptions(EditorInfo.IME_ACTION_DONE);

Danke an @Eliezer für die Korrektur

AjOnFire
quelle
20
Vielen Dank für diese setSoftInputMode-Methode ... Es hat mir wirklich geholfen ... Zusätzliche Informationen: Um auf Eigenschaften wie adjustPanund adjustResizefür den WindowManager.LayoutParamsUnterricht zuzugreifen , finden Sie viele nützliche Konstanten, die in der setSoftInputModeMethode verwendet werden können
Prasham
7
@SureshBora Ich kombinierte @ 66CLSjY Antwort und @aman und ich bekam schließlich dies: getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);Ich habe es bereits getestet und funktioniert wirklich
Humberto Castañeda
1
Wie ist das die richtige Antwort? Wie pro developer.android.com/reference/android/view/... die einzig akzeptable Werte zu übergeben Window#setSoftInputModesindWindowManager.LayoutParams.SOFT_INPUT_*
Eliezer
4
@ 66CLSjY Es funktioniert nicht bei mir. Kannst du mir sagen, was ich vermisse? Ich nenne dies innerhalb einer Aktivität: getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_NOTHING);Aber die Tastatur drückt immer noch mein FrameLayout nach oben, das über anderen Ansichten liegt. Aber genau das bleiben andere Ansichten an ihrer Stelle. Es funktioniert, wenn ich es im Manifest hinzufüge, aber ich möchte es nicht für die gesamte Aktivität anwenden.
Tamás Kozmér
1
Haben Sie setSoftInputMode vor setContentView in onCreate () aufgerufen?
AjOnFire
36

Laut Prashams Kommentar habe ich das getan und es hat mir dank ihm das Leben gerettet! Der EditTextund SoftWindowInput-Modus ist ziemlich fehlerhaft, wenn Sie ein Layout mit haben ScrollViewund es dynamisch füllen.

Da ich diesen Beitrag durchgesehen hatte, aber weiterhin andere Antworten / Kommentare gelesen hatte (wie Prashans), beschloss ich, ihn in einen neuen Beitrag zu schreiben.

Unter dem Code, den ich mit meinem verwendet habe ScrollView:

Activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
ein Mann
quelle
7
Hallo Aman, es ist ein wenig schwierig, deine Antwort hier zu lesen. Ich kann sehen, dass Sie Prashan sehr dankbar sind, aber können Sie bitte einige der persönlichen Kommentare löschen und einfach erklären, was dieser Code zur Lösung beitragen wird? Vielen Dank.
Taryn East
1
Hm, funktioniert nicht, zumindest um die Pfanne einzustellen. Es funktioniert nur, wenn ich es in das Manifest stecke.
Ixx
Dies stürzt die Anwendung ab.
Farrakh Javed
10

Ich möchte zwei verschiedene Modi für Registerkarten verwenden. Die Modi sind SOFT_INPUT_ADJUST_RESIZEund SOFT_INPUT_ADJUST_NOTHING.

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

Die obige Codezeile funktioniert einfach nicht von alleine. App verhält sich immer in einem Zustand ADJUST_NOTHING. Wenn windowSoftInputMode="adjustResize"es jedoch in das <activity>Tag in der Datei AndroidManifest.xml eingefügt wird , wird die Größe des App-Fensters standardmäßig geändert. Zusätzlich, wenn Sie folgende Zeile anrufen

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

Es wird sich wie erwartet verhalten und die Größe wird nicht geändert.

PS Verbesserung der Antwort

Shnkc
quelle
1
Ich muss zwischen RESIZE und NICHTS wechseln, wie das geht, wenn ich programmgesteuert zu nichts zurückkehre, ändert sich nichts an der Größe.
Taranmeet Singh
1
Das ist wirklich eine schöne Beobachtung. Grundsätzlich windowSoftInputMode="adjustResize"hilft die Einstellung im Manifest bei der späteren Behandlung dieses Flags. Insbesondere in einem Szenario, in dem Sie hauptsächlich Fragmente in einer einzelnen Aktivität haben. So kann man den Eingabestatus der Aktivität dynamisch ändern, indem man programmgesteuert von SOFT_INPUT_ADJUST_RESIZE zurück zu SOFT_INPUT_ADJUST_NOTHING bei Bedarf wechselt. Schön!
Sud007
0

Sie können den folgenden Code programmgesteuert verwenden

android.view.inputmethod.InputMethodManager imm = (android.view.inputmethod.InputMethodManager) context
                .getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

Danke Deepak

Sunil Kumar Sahoo
quelle
0

In Xamarin Android können Sie dies programmgesteuert tun

 protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.DetailDesign);
             Window.SetSoftInputMode(SoftInput.AdjustPan);
        }
zubairz
quelle