Wenn Sie AlertDialog.Builder mit EditText verwenden, wird die Soft-Tastatur nicht angezeigt

117

Ich verwende AlertDialog.Builder , um ein Eingabefeld mit EditText als Eingabemethode zu erstellen.

Leider wird die Soft-Tastatur nicht angezeigt , obwohl der EditText scharfgestellt ist, es sei denn, Sie berühren ihn erneut explizit.

Gibt es eine Möglichkeit, es zum Pop zu zwingen?

Ich habe nach dem (AlertDialog.Builder) .show () Folgendes versucht ; aber ohne Erfolg.

InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(input, InputMethodManager.SHOW_FORCED);

Kann jemand helfen?

Vielen Dank!!

Niros
quelle
1
Bitte formatieren Sie Ihren Quellcode.
Philipp
Dann habe ich dich auch positiv bewertet :) Ich hatte mehrere Stunden lang die gleiche Problemsuche und die letzte Antwort von grine4ka funktioniert großartig
philipp

Antworten:

222

Ich habe so etwas gemacht

AlertDialog.Builder b = new AlertDialog.Builder(this);//....
AlertDialog dialog = b.create();

dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

dialog.show();
grine4ka
quelle
3
Ich danke dir sehr. Ich habe jetzt schon eine Weile gesucht und das ist der Weg, den Sie gehen möchten. Alle OnFocusChangeListenerAnsätze scheinen mir zu viel und verursachen Ärger. Sie müssen das AlertDialogaus dem erstellen AlertDialog.Builder!
Philipp
Ist das wirklich eine Lösung? Dies zwingt die Tastatur lediglich zur Anzeige, unabhängig davon, ob ein Eingabefeld vorhanden ist oder nicht, unabhängig davon, ob das Eingabefeld fokussiert ist oder nicht, oder? =)
Ted
@Ted Sie haben Recht, dies ist nicht die richtige Lösung, aber es funktioniert. Ich habe versucht, so etwas zu tun, wenn im Dialogfeld kein Edittext vorhanden ist und keine Softtastatur angezeigt wird.
grine4ka
1
Ich schaffe es tatsächlich, es zu "lösen" (Workaround). Ich verwende den setOnFocusChangeListener für den EditText und in onFocusChange, wenn überprüft wird, ob er den Fokus hat (die Variable "hasFocus"), und wenn ja, getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIB);
Ted
1
Hinweis: Damit dies funktioniert, müssen Sie die setSoftInputModeZeile vor platzieren dialog.show() , sonst funktioniert sie nicht. +1 für die einfache richtige Lösung übrigens
Spikatrix
29

Ich habe es geschafft, es so zu lösen:

Dialog = builder.create();
Dialog.show();
Dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE  | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Alex Fragotsis
quelle
23

Ich habe herausgefunden, dass derselbe Code auf dem Tablet ordnungsgemäß funktioniert, die Tastatur wird zwar angezeigt, auf dem Telefon jedoch nicht. Daher scheint eine weitere Recherche auf die Option "Anpassen" hinzuweisen.

Ich benutze dies, fühlt sich viel sauberer an.

AlertDialog d = builder.create();
d.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
d.show();
Phuah Yee Keat
quelle
Vielen Dank. Dies muss besser sein als zu verwenden SOFT_INPUT_STATE_ALWAYS_VISIBLE. As SOFT_INPUT_STATE_ALWAYS_VISIBLEwird die UI-Komponenten des Dialogs blockieren, wo SOFT_INPUT_ADJUST_RESIZEdie Größe geändert und der Dialog "hochgeschoben" werden kann.
Cheok Yan Cheng
10

In meinem Fall konnte ich die Tastatur nur anzeigen, wenn der Dialog angezeigt wurde, indem ich Folgendes hinzufügte DialogFragment:

@Override
public void onResume() {
    super.onResume();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    myEditText.requestFocus();
}

Beachten Sie SOFT_INPUT_STATE_ALWAYS_VISIBLE anstelle von SOFT_INPUT_STATE_VISIBLE .

Aus der Dokumentation:

int SOFT_INPUT_STATE_ALWAYS_VISIBLE
Visibility state for softInputMode: please always make the soft input area visible when this window receives input focus.
vovahost
quelle
Dies war die einzige Lösung, die für mich funktionierte, und ich hatte VIELE davon ausprobiert. Meins war ein Dialogfragment, das vom Alertdialog Builder erstellt wurde. Das wichtige Bit schien darin zu bestehen, den obigen Code in onResume () zu platzieren. Überall sonst hat es einfach nicht funktioniert!
user960914
6

Wenn Sie showDialog aufrufen, um einen mit AlertDialog erstellten Dialog in onCreateDialog anzuzeigen

Sie sollten den Code hier einfügen

    @Override
protected void onPrepareDialog (int id, Dialog dialog, Bundle args)
{
    TextView editText=(TextView) dialog.findViewById(R....);

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
       @Override
       public void onFocusChange(View v, boolean hasFocus) {
         if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
         }
       }
    });

}
user590912
quelle
5

Eine viel bessere Lösung wird hier gegeben .

dialog.getWindow().clearFlags(
         WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
        |WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

Keine Problemumgehung. EditTextverhält sich wie erwartet.

Sulai
quelle
Dieser funktionierte für mich, die andere Lösung brachte den Fokus, aber das Keybord wurde nicht angezeigt.
Akshay
2
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);
Mohammed Shoeb
quelle
1

Dies wurde hier bereits beantwortet . Die Verwendung eines OnFocusChangeListener hat bei mir funktioniert.

dhaag23
quelle
In der Frage wird gefragt, wie der Soft-Eingabemodus für ein AlertDialog.Builder-Objekt festgelegt wird. Der Thread, auf den Sie verweisen, enthält jedoch ein Beispiel für die Verwendung eines AlertDialog-Objekts. Wenn ich versuche, den vorgeschlagenen Code zu verwenden (mithilfe von alert.getWindow (). SetSoftInputMode (...) in OnFocusChangeListener), Eclipse-Objekte, bei denen die Methode getWindow () nicht für den Typ AlertDialog.Builder definiert ist. Können Sie mir bitte helfen, das zu beheben?
Prepbgg
1

In meinem Fall wurde der SoftInputMode nicht angezeigt, als ich ihn festlegte, bevor der Dialog angezeigt wurde (nachdem er erstellt wurde). Der folgende Code hat bei mir funktioniert, bei dem ich den SoftInputMode nach dem Anzeigen des Dialogfelds festgelegt habe.

Kotlin:

val dialog = MaterialAlertDialogBuilder(context) // Other builder code
                .create()
dialog.show()
dialog.window?.apply { // After the window is created, get the SoftInputMode
    clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
    clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
    setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
}

Java:

AlertDialog dialog = MaterialAlertDialogBuilder(getContext()) // Other builder code
                .create();
dialog.show();
Window window = dialog.getWindow();
if(window != null){ // After the window is created, get the SoftInputMode
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

Ich hoffe, das hilft jedem, der das gleiche Problem hatte wie ich.

AurumTechie
quelle
0

Versuchen Sie das, es funktioniert für mich

Wenn Sie eine Softtastatur anzeigen möchten:

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.showSoftInput(input.getWindowToken(), 0);

Und wenn du es verstecken willst:

  InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(input.getWindowToken(), 0);
Yogesh Rathi
quelle
0
final AlertDialog.Builder alert = new AlertDialog.Builder(context);

final AlertDialog dialog = alert.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
TonnyTao
quelle
1
Es ist besser, einen Kontext / eine Erklärung in den Code aufzunehmen, da dies die Antwort für das OP und für zukünftige Leser nützlicher macht.
EJoshuaS
0

Dieses Problem tritt auf, wenn EditText nach dem Aufruf von AlertDialog.onCreate hinzugefügt wird.

https://developer.android.com/reference/androidx/appcompat/app/AlertDialog.Builder

Die AlertDialog-Klasse sorgt dafür, dass android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM automatisch für Sie festgelegt wird, je nachdem, ob Ansichten im Dialogfeld von View.onCheckIsTextEditor () true zurückgeben.

Sie müssen das Flag FLAG_ALT_FOCUSABLE_IM löschen.

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 

Da AlertDialog.show in DialogFragment.onStart aufgerufen wird, können Sie den Code in DialogFragment.onStart einfügen.

@Override
public void onStart() {
    super.onStart();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

Oder Sie können den Dialog.setOnShowListener verwenden, wenn Sie kein DialogFragment verwenden.

dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {
        getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    }
});
Sungsuh Park
quelle