Ich mag es, wenn meine Benutzeroberflächen intuitiv sind. Jeder Bildschirm sollte den Benutzer natürlich und unauffällig zum nächsten Schritt in der App führen. Ansonsten bemühe ich mich, die Dinge so verwirrend und verwirrend wie möglich zu gestalten.
Ich mache nur Spaß :-)
Ich habe drei TableRow
Sekunden, die jeweils ein schreibgeschütztes und nicht fokussierbares EditText-Steuerelement und dann eine Schaltfläche rechts davon enthalten. Jede Schaltfläche startet dieselbe Aktivität, jedoch mit einem anderen Argument. Der Benutzer trifft dort eine Auswahl, und die Unteraktivität wird beendet, wobei die entsprechende EditText
Auswahl mit der Auswahl des Benutzers gefüllt wird.
Es ist der klassische Mechanismus für kaskadierende Werte. Jede Auswahl schränkt die verfügbaren Optionen für die nächste Auswahl usw. ein. Daher deaktiviere ich beide Steuerelemente in jeder der nächsten Zeilen, bis der EditText in der aktuellen Zeile einen Wert enthält.
Ich muss eines von zwei Dingen in dieser Reihenfolge tun:
- Wenn Sie auf eine Schaltfläche klicken, entfernen Sie sofort den Fokus, ohne den Fokus auf eine andere Schaltfläche zu setzen
- Stellen Sie den Fokus auf die erste Schaltfläche, wenn die Aktivität beginnt
Das Problem tritt auf, nachdem die Unteraktivität zurückgekehrt ist. Die Schaltfläche, auf die geklickt wurde, behält den Fokus.
Betreff: Nr. 1 oben - Es scheint keine removeFocus()
Methode oder ähnliches zu geben
Betreff: # 2 oben - Ich kann requestFocus()
den Fokus auf die Schaltfläche in der nächsten Zeile setzen, und das funktioniert, nachdem die Unteraktivität zurückgekehrt ist, aber aus irgendeinem Grund funktioniert es nicht in der übergeordneten Aktivität onCreate()
.
Ich benötige Konsistenz der Benutzeroberfläche in beide Richtungen - entweder haben keine Schaltflächen nach Abschluss der Unteraktivität den Fokus oder jede Schaltfläche erhält den Fokus abhängig von ihrer Position im Logikfluss, einschließlich der allerersten (und einzigen) aktiven Schaltfläche vor einer Auswahl.
quelle
Alte Frage, aber ich bin darauf gestoßen, als ich ein ähnliches Problem hatte und dachte, ich würde teilen, was ich letztendlich getan habe.
Die Ansicht, die den Fokus gewann, war jedes Mal anders, also benutzte ich die sehr allgemeine:
quelle
getCurrentFocus()?.clearFocus();
, so schön und elegant: - /Sie können verwenden
View.clearFocus()
.Verwenden Sie
View.requestFocus()
aufgerufen vononResume()
.quelle
android:descendantFocusability="beforeDescendants"
Die Verwendung des Folgenden in der Aktivität mit einigen Layoutoptionen unten schien wie gewünscht zu funktionieren.
in Verbindung mit den folgenden Parametern in der Stammansicht.
https://developer.android.com/reference/android/view/ViewGroup#attr_android:descendantFocusability
Antwort dank: https://forums.xamarin.com/discussion/1856/how-to-disable-auto-focus-on-edit-text
Informationen zu windowSoftInputMode
quelle
Ich verwende dies, wenn die Aktualisierung der Profilinformationen bereits abgeschlossen ist, und entferne den gesamten Fokus von EditText in meinem Layout
====> Update: Im übergeordneten Layoutinhalt meine EditText-Zeile hinzufügen:
quelle
Wie wäre es, wenn Sie nur
android:windowSoftInputMode="stateHidden"
Ihre Aktivität im Manifest hinzufügen?Entnommen von einem klugen Mann, der dies kommentiert: https://stackoverflow.com/a/2059394/956975
quelle
Zuallererst wird es 100% funktionieren ........
onResume()
Methode erstellen .onResume()
finden Sie die Ansicht, die immer wieder durch fokussiertfindViewById()
.onResume()
SetrequestFocus()
auf diese Ansicht.onResume()
SetclearFocus
auf diese Ansicht.focusable
true undfocusableInTuch
true.onResume()
finden Sie die obige Draufsicht vonfindViewById
onResume()
SetrequestFocus()
auf diese Ansicht zuletzt setzen.quelle
Ich habe versucht, die Fokussierbarkeit für die Ansicht zu deaktivieren und zu aktivieren, und es hat bei mir funktioniert (Fokus wurde zurückgesetzt):
quelle
Sie können versuchen, die Fähigkeit der Hauptaktivität zum Speichern ihres Status auszuschalten (wodurch vergessen wird, welches Steuerelement Text und welches Fokus hatte). Sie müssen sich auf andere Weise merken, was Ihre EditText-Dateien haben, und sie auf Resume () neu füllen. Starten Sie Ihre Unteraktivitäten mit startActivityForResult () und erstellen Sie in Ihrer Hauptaktivität einen onActivityResult () -Handler, der die EditText-Dateien korrekt aktualisiert. Auf diese Weise können Sie die richtige Schaltfläche festlegen, die Sie auf Resume () fokussieren möchten, während Sie die EditText-Dateien mithilfe eines myButton.post (new Runnable () {run () {myButton.requestFocus ();}} neu füllen.
Die View.post () -Methode ist nützlich, um den Fokus zunächst festzulegen, da diese ausführbare Datei ausgeführt wird, nachdem das Fenster erstellt wurde und sich die Dinge beruhigt haben, sodass der Fokusmechanismus zu diesem Zeitpunkt ordnungsgemäß funktioniert. Der Versuch, den Fokus während onCreate / Start / Resume () zu setzen, hat normalerweise Probleme.
Bitte beachten Sie, dass dies Pseudocode ist und nicht getestet wurde, aber es ist eine mögliche Richtung, die Sie versuchen könnten.
quelle
Fügen Sie sie Ihrer ViewGroup hinzu, die Ihre EditTextView enthält. Es funktioniert ordnungsgemäß für mein Einschränkungslayout. Ich hoffe das hilft
quelle
Versuchen Sie Folgendes (anrufen
clearAllEditTextFocuses();
)quelle