Softtastatur für Dialog anzeigen

74

Ich zeige einen Dialog mit einer Edittext-Ansicht an. Das Softkeyboard wird jedoch nur geöffnet, wenn der Benutzer in der Bearbeitungsansicht drückt. Also habe ich versucht, einen InputMethodManager mit dem folgenden Code aufzurufen.

InputMethodManager imm =
 (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(dialogField,0);

Das dialogField ist das Eingabefeld. Wann genau soll ich das tun? Ich habe es in der onStart () -Methode des Dialogfelds versucht, aber es passiert nichts. Ich habe auch versucht, den Fokus für das dialogField anzufordern, aber das ändert nichts.

Ich habe auch diesen Code ausprobiert

dialogField.setOnFocusChangeListener(new View.OnFocusChangeListener()
{
    public void onFocusChange (View v, boolean hasFocus)
    {
        if (hasFocus)
        {
            Main.log("here");
            dialogInput.getWindow().setSoftInputMode(
              WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
            /*
                InputMethodManager mgr =
                  (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                mgr.showSoftInput(dialogField,0);
            */
        }
    }
});

in beiden Versionen. Es möchte aber keine Softtastatur erscheinen. Das Main.log ist nur ein Protokoll, das mir zeigt, dass die Funktion tatsächlich aufgerufen wird. Und ja, es heißt.

Ich könnte die Tastatur mit dem SHOW_FORCED-Flag erhalten, bevor der Dialog geöffnet wird. Aber dann wird es beim Verlassen nicht geschlossen. Und das kann ich nur, bevor ich den Dialog zeige. In Rückrufen funktioniert es auch nicht.

Rene
quelle
Haben Sie das SHOW_IMPLICIT-Flag ausprobiert?
Telmo Marques
1
Dies ist etwas, mit dem ich übermäßig zu kämpfen hatte, aber nicht richtig arbeiten konnte.
Thomas
Ja, ich habe das SHOW_IMPLICIT-Flag ausprobiert. In der Dokumentation heißt es genau, dass Sie showSoftInput aufrufen sollten, wenn vom Benutzer eine Eingabe für ein TextEdit erwartet wird. Aber wie?
Rene
Dies wurde hier beantwortet und es funktioniert großartig für mich.
Shawn Lauzon

Antworten:

182

Tolle Frage, ich habe auch versucht, das zu tun und eine Lösung gefunden.

Mit der Dialog Builder-Klasse müssen AlertDialog.BuilderSie den Dialog wie folgt aufrufen:

AlertDialog.Builder builder = new AlertDialog.Builder();
AlertDialog dialog;

builder.set...

dialog = builder.create();
dialog.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);
dialog.show();

Das hat bei mir gut funktioniert.

Hinweis: Sie müssen import android.view.WindowManager.LayoutParams;für den konstanten Wert dort.

Funke
quelle
1
Ich frage mich, wie sich dies auf das Fensterverhalten auswirkt, nachdem der Dialog geschlossen wurde. Vergessen wir nicht, dass das Fenster auch den Dialog und Ihre Aktivitäten enthält
Alex.F
4
Für alle mit dem gleichen Problem Hinweis, setSoftInputMode()der vorher aufgerufen werden muss show().
Abbas
2
für mich arbeitete mit 'SOFT_INPUT_STATE_ALWAYS_VISIBLE'
abbasalim
2
Wow vielen Dank! Können wir bitte eine Spende hinzufügen oder einen Beitrag zu SO leisten, um Wertschätzung zu zeigen?
Joel Broström
1
ENDLICH eine Antwort! Für alle, die es aus einer benutzerdefinierten Dialogklasse verwenden möchten, rufen Sie einfach getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);die onCreate()Methode auf.
Nekomajin42
14
 AlertDialog dialog = new AlertDialog.Builder(this).create();
    dialog.show();
    Window window = dialog.getWindow();
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Deli Coder
quelle
1
Alter, du bist unglaublich! Diese windows.cl3wrFlags-Zeile ist wichtig. Ich hatte jede SO-Antwort überprüft und diese Zeile wurde nirgendwo anders erwähnt. Danke, Mann!
FreakyLearner
5

Kotlin

Hier ist der getestete Code.

val dialog = AlertDialog.Builder(requireContext()).apply {
    setTitle(…)
    setView(editText)
    setPositiveButton(…)
    setNegativeButton(…)
}
val window = dialog.show().window
window?.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)

Stellen Sie sicher, dass Sie über die Methode auf die windowEigenschaft zugreifen show(). Das Abrufen windowvon der create()Methode kehrte nullfür mich zurück, sodass die Tastatur nicht angezeigt wurde.

Importieren AlertDialogaus androidx.appcompat.app.AlertDialog. Importieren WindowManageraus android.view.

Yogesh Umesh Vaity
quelle
1
Vielen Dank! clearFlags hat es für mich
behoben
0

Dialogfragment mit Kotlin

onStart-Methode überschreiben

override fun onStart() {
    super.onStart()
    dialog.window?.
    setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE
    )
}

Wenn Sie nach dem Schließen schließen möchten, überschreiben Sie die Entlassungsmethode mit dem folgenden Code

override fun onDismiss(dialog: DialogInterface?) {
val inputMethodManager = context?.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        inputMethodManager.hideSoftInputFromWindow(activity?.currentFocus?.windowToken, InputMethodManager.HIDE_IMPLICIT_ONLY)
}
Ritesh Niwane
quelle