Ich möchte einen EditText, der beim Drücken einen DatePicker erstellt. Also schreibe ich folgenden Code:
mEditInit = (EditText) findViewById(R.id.date_init);
mEditInit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showDialog(DATEINIT_DIALOG);
}
});
Wenn ich jedoch den EditText drücke, ist die Aktion typisch: Ein Cursor, der auf die Eingabe von Text wartet, zeigt stattdessen den gewünschten Dialog an.
android
android-edittext
onclicklistener
xger86x
quelle
quelle
Antworten:
Die Tastatur scheint zu erscheinen, wenn der EditText den Fokus erhält. Um dies zu verhindern, setzen Sie focusable auf false:
Dieses Verhalten kann je nach Android-Betriebssystem der verschiedenen Hersteller variieren, aber auf den von mir getesteten Geräten hat sich dies als ausreichend erwiesen. Wenn die Tastatur immer noch angezeigt wird, scheint es auch hilfreich zu sein, Hinweise anstelle von Text zu verwenden:
Sobald Sie dies getan haben, sollte Ihr On-Click-Listener wie gewünscht funktionieren:
quelle
Normalerweise möchten Sie maximale Kompatibilität mit
EditText
dem normalen Verhalten.Sie sollten also nicht verwenden,
android:focusable="false"
da die Ansicht einfach nicht mehr fokussierbar ist, was schlecht aussieht. Der Hintergrund, der gezeichnet werden kann, zeigt beispielsweise nicht mehr den Status "gedrückt" an.Was Sie stattdessen tun sollten, ist Folgendes:
Durch Setzen des Eingabetyps auf
TYPE_NULL
verhindern Sie, dass die Softwaretastatur auftaucht.Durch Setzen von
OnClickListener
und stellenOnFocusChangeListener
Sie sicher, dass Ihr Dialogfeld immer geöffnet wird, wenn der Benutzer in dasEditText
Feld klickt , sowohl wenn er den Fokus erhält (erster Klick) als auch bei nachfolgenden Klicks.Nur einstellen
android:inputType="none"
odersetInputType(InputType.TYPE_NULL)
ist nicht immer genug. Bei einigen Geräten sollten Sie auchandroid:editable="false"
XML festlegen , obwohl dies veraltet ist. Wenn es nicht mehr funktioniert, wird es einfach ignoriert (wie alle XML-Attribute, die nicht unterstützt werden).quelle
EditText
Komponente vielleicht das einzige Widget in Ihrem Layout? Können Sie versuchenandroid:focusable="true"
, Ihr übergeordnetes Layout zu erweitern?Ich hatte das gleiche Problem. Der Code ist in Ordnung, aber stellen Sie sicher, dass Sie den fokussierbaren Wert des EditText in false ändern.
Ich hoffe das hilft jedem, der ein ähnliches Problem hatte!
quelle
Standardfunktion von
EditText
: Beim ersten Klicken wird fokussiert und beim zweiten Klick wird behandelt,onClickListener
sodass Sie den Fokus deaktivieren müssen. Klicken Sie dann beim ersten Klicken auf dasonClickListener
Testament.Dazu müssen Sie dieses
android:focusableInTouchMode="false"
Attribut zu Ihrem hinzufügenEditText
. Das ist es!Etwas wie das:
quelle
EditText
wird jedoch nicht mehr bearbeitet und der Cursor wird nicht angezeigt.Hier ist die Lösung, die ich implementiert habe
ODER
Überzeugen Sie sich selbst von den Unterschieden. Das Problem ist, dass (wie RickNotFred sagte) TextView das Datum anzeigt und über den DatePicker bearbeitet. TextEdit wird nicht für den Hauptzweck verwendet. Wenn der DatePicker erneut angezeigt werden soll, müssen Sie delete (1. Fall) oder de focus (2. Fall) eingeben.
Strahl
quelle
Wenn Sie die OnClick-Aktion für EditText verwenden, wie folgt:
Java:
oder Kotlin:
So wird es perfekt funktionieren , wenn Sie setzen in
xml
IhrenEditText
folgenden Zeilen:Beispielsweise:
oder für MaterialDesign
quelle
IMHO stimme ich der Aussage von RickNotFred nicht zu:
Das Anzeigen eines Dialogfelds zum Bearbeiten des Datums beim Drücken des EditText ist dem Standard sehr ähnlich, bei dem eine Tastatur oder ein Ziffernblock angezeigt wird. Die Tatsache, dass das Datum mit dem EditText angezeigt wird, signalisiert dem Benutzer, dass das Datum geändert werden kann. Das Anzeigen des Datums als nicht bearbeitbare Textansicht signalisiert dem Benutzer, dass das Datum möglicherweise nicht geändert wird.
quelle
Schönes Thema. Nun, ich habe es getan. In der XML-Datei:
Im Java-Code:
quelle
Das Folgende funktioniert perfekt für mich.
Setzen Sie zuerst die Eingabe Ihres Datumsauswahl-Widgets auf "Keine", um zu verhindern, dass die Softtastatur auftaucht:
Fügen Sie dann diese Ereignis-Listener hinzu, um den Dialog mit der Datumsauswahl anzuzeigen:
Eine letzte Sache. Um sicherzustellen, dass eingegebene Tage, Monate oder Jahre korrekt aus der Datumsauswahl kopiert wurden, rufen Sie an,
datePicker.clearFocus()
bevor Sie die Werte abrufen , z. B. übergetMonth()
.quelle
Das funktioniert bei mir:
quelle
Hier ist, was für mich funktioniert hat
Setzen Sie editierbar auf false
/>
Fügen Sie dann einen Ereignis-Listener für OnFocusChange hinzu
quelle
Wie Dillon Kearns vorschlug, funktioniert es gut, wenn man sich auf falsch fokussiert. Wenn Sie jedoch die Tastatur abbrechen möchten, wenn Sie auf EditText klicken, möchten Sie möglicherweise Folgendes verwenden:
quelle
Warum hat niemand erwähnt
setOnTouchListener
? Die VerwendungsetOnTouchListener
ist einfach und in Ordnung und gibt nur true zurück, wenn der Listener das Ereignis konsumiert hat, andernfalls false.quelle