Wie führe ich die Einstellungsnavigation für SwitchReference wie die App für native Android-Einstellungen?
Wenn Sie auf die WiFi-Region klicken (nicht auf dem Switch), wird zu einem neuen Bildschirm navigiert:
Meine App ändert nur den Schalter von EIN auf AUS und umgekehrt, auch wenn ich nicht auf den Schalter klicke.
Ich verwende PreferenceFragment
und xml für den Bildschirm. Und meine Präferenz folgt dem Beispiel aus der Android PreferenceFragment-Dokumentation . Ich entwickle meine App auf ICS 4.0 API 14.
Weiß jemand, wie man das macht?
Bearbeitet:
Mein XML sieht so aus:
%Vor%Wenn Sie sich die Quelle der Stock-Einstellungen-App ansehen, können Sie herausfinden, wie sie es gemacht hat.
Im Grunde genommen verwenden sie einen benutzerdefinierten ArrayAdapter (ähnlich wie bei einem ListView), um Zeilen mit Schalterschaltflächen anzuzeigen. Und für den zweiten Bildschirm verwenden sie einfach die CustomView, die in der ActionBar verfügbar ist.
Ich sehe hier zwei Fragen: 1. Wie höre ich Präferenzklicks außerhalb des Schalterbereichs? 2. Wie setze ich einen Schalter in die Aktionsleiste?
Ich beantworte Frage 1:
Ich habe eine neue Klasse SwitchPreference
erstellt und die Methode onClick
überschrieben, um nichts zu tun. Dies verhindert, dass sich die Einstellung ändert, wenn außerhalb des Schalters geklickt wird.
Verwendung (xml):
%Vor%Verwendung (Java):
%Vor%Ich habe es versucht und ein bisschen gekämpft. Ich dachte, ich würde meine Erfahrung teilen.
Zuerst versuchte ich die Antwort von XGouchet , da sie die meisten Stimmen hatte. Die Lösung war ziemlich kompliziert und erforderte die Verwendung von Einstellungsheadern , die sehr cool sind, aber nicht passten Womit ich beschäftigt war. Ich entschied, dass die einfachste Sache für mich ist, meine preferenceFragment in ein reguläres Fragment zu verpacken und die Switch-Präferenz mit einer normalen Ansicht zu fälschen. Ich habe die Android-Quelle für eine Vorliebe ausgegraben und kam mit diesem
%Vor%Das FrameLayout oben bekommt ein Präferenzfragment wie folgt
%Vor%Dann kann ich meine Klickhörer wie in jeder normalen Ansicht zuweisen. SettingsPreferencesFragment ist nur ein Standard-Präferenzfragment.
Diese Lösung schien ziemlich gut zu sein, aber dann bemerkte ich seltsame Layout-Probleme auf Tablets. Ich erkannte, dass ich Schwierigkeiten haben würde, diese Lösung auf allen Geräten richtig aussehen zu lassen, und ich brauchte eine echte switchPreference, keine gefälschte.
============== Lösung 2 ================
Die Lösung von AlikElzin-kilaka war nett und einfach, funktionierte aber nicht, als ich es versuchte. Ich habe ein zweites Mal versucht, um sicherzustellen, dass ich nicht nur falsch gemacht habe. Ich spielte weiter herum und dachte mir etwas aus, das zu funktionieren scheint. Er hat einen guten Punkt über
2 Fragen hier: 1. Wie man Präferenzklicke außerhalb des hört Bereich wechseln? 2. Wie setze ich einen Schalter in die Aktionsleiste?
Wirklich nur Frage (1) ist es wert, beantwortet zu werden, weil Frage 2 hier und andere Orte
Ich erkannte, dass der einzige Weg, um auf die Ansichten in einer Voreinstellung zuzugreifen, darin bestand, eine untergeordnete Klasse zu erstellen und onBind . Daher habe ich diese untergeordnete Klasse von SwitchPreference entwickelt, die separate Click-Handler für den Switch als gesamte Ansicht erstellt. Es ist immer noch ein Hack.
%Vor%Er verwendet die rekursive Funktion findSwitchWidget, um den Baum zu durchlaufen, bis er einen Schalter findet. Ich hätte lieber Code wie folgt schreiben:
%Vor%Aber es scheint keinen Weg zu geben, zu diesem internen ID-Wert zu gelangen, den ich kenne. Sobald wir den eigentlichen Schalter haben, können wir ihm und der Containeransicht Listener zuweisen. Die Voreinstellung für den Wechsel wird nicht automatisch aktualisiert, daher ist es notwendig, die Einstellung selbst zu speichern.
%Vor%Hoffentlich kommt dieser zweite Hack nicht zurück, um mich zu beißen.
Irgendjemand sieht mögliche Fallstricke dieser Methode?
Ich habe auch eine etwas verbesserte Version des Codes auf github Ссылка
gestelltTags und Links android android-preferences