Android: Software-Tastatur automatisch anzeigen, wenn der Fokus auf einem EditText liegt
Lesezeit: 8 Minuten
Randy Sugianto ‘Yuku’
Ich zeige ein Eingabefeld mit AlertDialog. Die EditText Innerhalb des Dialogs selbst wird automatisch fokussiert, wenn ich anrufe AlertDialog.show()aber die Soft-Tastatur wird nicht automatisch angezeigt.
Wie lasse ich die Soft-Tastatur automatisch anzeigen, wenn der Dialog angezeigt wird? (und es gibt keine physische/Hardware-Tastatur). Ähnlich wie beim Drücken der Suchtaste zum Aufrufen der globalen Suche wird die Soft-Tastatur automatisch angezeigt.
Dies sollte gemäß Teds Kommentar unten automatisch geschehen. Überprüfen Sie das zuerst!
– Cheezmeister
8. August 2012 um 18:26 Uhr
Diese Antwort ist am einfachsten und funktioniert gut: stackoverflow.com/a/8018630/89818
– kräh
19. Januar 2015 um 0:46 Uhr
Überprüfen Sie diesen Link, er funktioniert bei mir
– Yogesh Rathi
30. März 2016 um 11:08 Uhr
Ich bin im Laufe der Jahre mehrmals auf diese Antwort zurückgekommen. Es ist immer innerhalb eines Dialogs, dass ich dieses Problem habe, niemals Fragment oder Activity.
– tir38
28. Mai 2016 um 3:55 Uhr
Mögliches Duplikat von Close/hide the Android Soft Keyboard
– Md. Imran Choudhury
26. Februar 2017 um 9:59 Uhr
Sie können einen Fokus-Listener auf dem erstellen EditText auf der AlertDialogdann nimm die AlertDialog‘S Window. Von dort aus können Sie die Soft-Tastatur anzeigen lassen, indem Sie anrufen setSoftInputMode.
final AlertDialog dialog = ...;
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);
}
}
});
Wie würde ich es mit dem AlertDialog.Builder machen? …final AlertDialog.Builder alert = new AlertDialog.Builder(Main.this);
– Stefan
25. Januar 2011 um 18:02 Uhr
@Stephen Sie können den Dialog vom Builder abrufen, indem Sie verwenden final AlertDialog dialog = builder.create() und dann showim Dialogfeld anstelle des Builders.
– tidbeck
11. Oktober 2011 um 9:38 Uhr
ICH ZIEHE MEINEN KOMMENTAR OBEN ZURÜCK Ich habe herausgefunden, dass Sie sich Ihr XML ansehen sollten, wenn Sie den Fokus nicht richtig hinbekommen! Wenn Sie das Etikett sehen drin – entfernen. Es scheint, als würde das Tag EditText den Fokus geben, und dann wird Ihr Listener nicht gefeuert, da EditText bereits den Fokus hat.
–Ted
20. Oktober 2011 um 13:09 Uhr
Wie machen Sie das nicht, wenn das Gerät eine Hardware-Tastatur hat? Scheint, als wäre dies für diese Benutzer ärgerlich.
– mxkl
8. März 2012 um 17:23 Uhr
Ich verstehe wirklich nicht, warum dies nicht das Standardverhalten im SDK ist. Wenn eine Ansicht, die eine Texteingabe erfordert, einen blinkenden Cursor anzeigt, warum sollte jemand die Tastatur nicht sehen wollen, um Text einzugeben? Es fühlt sich für mich so falsch von einer UX an
Dies funktioniert besonders gut, wenn Sie die Soft-Tastatur basierend auf dem Umschalten der Sichtbarkeit einer Ansicht in Ihrem Layout zwischen SICHTBAR und GEGANGEN ein-/ausblenden möchten.
– PacificSky
5. Juli 2012 um 18:47 Uhr
Ich würde vorschlagen, stattdessen das SHOW_IMPLICIT-Flag zu verwenden, da dies bedeutet, dass das Ändern der Aktivität oder Anwendung die Tastatur wie erwartet automatisch ausblendet.
– Cassie
10. April 2013 um 1:28 Uhr
@drspaceboo Die Verwendung von SHOW_IMPLICIT funktioniert bei mir überhaupt nicht, ich muss SHOW_FORCED verwenden, nicht sicher warum …
– Yoann Hercouet
26. April 2014 um 14:27 Uhr
Wann sollte der obige Code ausgeführt werden? Ich habe es versucht, kurz nachdem ich mein Layout zu seinem übergeordneten Element hinzugefügt hatte. Das hat nicht funktioniert. Aber wenn ich es gemacht habe, nachdem das Layout schon eine Weile da war, hat es funktioniert. Gibt es also einen Rückruf, der mir sagt: “Wenn Sie jetzt versuchen, die Tastatur anzuzeigen, funktioniert sie tatsächlich”?
– Wilhelm Jockusch
19. Januar 2015 um 21:26 Uhr
toggleSoftInput(InputMethodManager.SHOW_FORCED,0) schaltet die Soft-Tastatur um. Wenn Sie sicherstellen möchten, dass die Tastatur angezeigt wird, können Sie stattdessen imm.showSoftInput( view, InputMethodManager.SHOW_IMPLICIT ) verwenden, wobei view die Ansicht ist, die die Eingabe erhält.
– PJ_Finnegan
21. Mai 2015 um 12:38 Uhr
Bao Le
Sie können direkt nach dem Erstellen des Dialogs eine Soft-Tastatur anfordern (Test auf SDK – r20)
Für alle, die sich fragen, öffnet diese Methode die Softwaretastatur nicht, wenn eine Hardwaretastatur angeschlossen ist. Ich habe gerade mit einem USB-On-The-Go-Kabel getestet. Perfekt!
– 13rac1
27. Januar 2016 um 18:25 Uhr
Das bringt mir nichts.
– JohnyTex
24. März 2016 um 11:02 Uhr
Ich habe keine Hardware-Tastatur. Vielleicht Konfiguration (?)
Ich hatte das gleiche Problem und habe es mit folgendem Code gelöst. Ich bin mir nicht sicher, wie es sich auf einem Telefon mit Hardware-Tastatur verhalten wird.
// TextEdit
final EditText textEdit = new EditText(this);
// Builder
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle("Enter text");
alert.setView(textEdit);
alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String text = textEdit.getText().toString();
finish();
}
});
alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
// Dialog
AlertDialog dialog = alert.create();
dialog.setOnShowListener(new OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(textEdit, InputMethodManager.SHOW_IMPLICIT);
}
});
dialog.show();
Codeausschnitte aus anderen Antworten funktionieren, aber es ist nicht immer offensichtlich, wo sie im Code platziert werden müssen, insbesondere wenn Sie eine verwenden AlertDialog.Builder und folgte dem Offizielles Dialog-Tutorial weil es nicht verwendet final AlertDialog ... oder alertDialog.show().
Weil SOFT_INPUT_STATE_ALWAYS_VISIBLE die Tastatur ausblendet, wenn der Fokus von EditText weg wechselt, wobei SHOW_FORCED die Tastatur angezeigt hält, bis sie explizit geschlossen wird, selbst wenn der Benutzer zum Startbildschirm zurückkehrt oder die letzten Apps anzeigt.
Unten ist Arbeitscode für einen AlertDialog, der mit einem benutzerdefinierten Layout mit einem in XML definierten EditText erstellt wurde. Es legt auch fest, dass die Tastatur eine “Go”-Taste hat und ermöglicht es ihr, die positive Taste auszulösen.
alert_dialog.xml:
<RelativeLayout
android:id="@+id/dialogRelativeLayout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<!-- android:imeOptions="actionGo" sets the keyboard to have a "go" key instead of a "new line" key. -->
<!-- android:inputType="textUri" disables spell check in the EditText and changes the "go" key from a check mark to an arrow. -->
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:layout_marginLeft="4dp"
android:layout_marginRight="4dp"
android:layout_marginBottom="16dp"
android:imeOptions="actionGo"
android:inputType="textUri"/>
</RelativeLayout>
AlertDialog.java:
import android.app.Activity;
import android.app.Dialog;
import android.content.DialogInterface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.DialogFragment;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatDialogFragment;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;
public class CreateDialog extends AppCompatDialogFragment {
// The public interface is used to send information back to the activity that called CreateDialog.
public interface CreateDialogListener {
void onCreateDialogCancel(DialogFragment dialog);
void onCreateDialogOK(DialogFragment dialog);
}
CreateDialogListener mListener;
// Check to make sure that the activity that called CreateDialog implements both listeners.
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (CreateDialogListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement CreateDialogListener.");
}
}
// onCreateDialog requires @NonNull.
@Override
@NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(getActivity());
LayoutInflater customDialogInflater = getActivity().getLayoutInflater();
// Setup dialogBuilder.
alertDialogBuilder.setTitle(R.string.title);
alertDialogBuilder.setView(customDialogInflater.inflate(R.layout.alert_dialog, null));
alertDialogBuilder.setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mListener.onCreateDialogCancel(CreateDialog.this);
}
});
alertDialogBuilder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
mListener.onCreateDialogOK(CreateDialog.this);
}
});
// Assign the resulting built dialog to an AlertDialog.
final AlertDialog alertDialog = alertDialogBuilder.create();
// Show the keyboard when the dialog is displayed on the screen.
alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
// We need to show alertDialog before we can setOnKeyListener below.
alertDialog.show();
EditText editText = (EditText) alertDialog.findViewById(R.id.editText);
// Allow the "enter" key on the keyboard to execute "OK".
editText.setOnKeyListener(new View.OnKeyListener() {
public boolean onKey(View v, int keyCode, KeyEvent event) {
// If the event is a key-down event on the "enter" button, select the PositiveButton "OK".
if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
// Trigger the create listener.
mListener.onCreateDialogOK(CreateDialog.this);
// Manually dismiss alertDialog.
alertDialog.dismiss();
// Consume the event.
return true;
} else {
// If any other key was pressed, do not consume the event.
return false;
}
}
});
// onCreateDialog requires the return of an AlertDialog.
return alertDialog;
}
}
9251300cookie-checkAndroid: Software-Tastatur automatisch anzeigen, wenn der Fokus auf einem EditText liegtyes
Dies sollte gemäß Teds Kommentar unten automatisch geschehen. Überprüfen Sie das zuerst!
– Cheezmeister
8. August 2012 um 18:26 Uhr
Diese Antwort ist am einfachsten und funktioniert gut: stackoverflow.com/a/8018630/89818
– kräh
19. Januar 2015 um 0:46 Uhr
Überprüfen Sie diesen Link, er funktioniert bei mir
– Yogesh Rathi
30. März 2016 um 11:08 Uhr
Ich bin im Laufe der Jahre mehrmals auf diese Antwort zurückgekommen. Es ist immer innerhalb eines Dialogs, dass ich dieses Problem habe, niemals Fragment oder Activity.
– tir38
28. Mai 2016 um 3:55 Uhr
Mögliches Duplikat von Close/hide the Android Soft Keyboard
– Md. Imran Choudhury
26. Februar 2017 um 9:59 Uhr