Ich erstelle ein Einstellungsmenü für eine kostenlose Version meiner App. Ich habe eine ListPreference
, die viele verschiedene Optionen anzeigt. Allerdings sollen nur einige dieser Optionen in der kostenlosen Version verfügbar sein (ich möchte, dass alle Optionen sichtbar sind - aber deaktiviert, damit der Benutzer weiß, was ihm fehlt!).
Ich habe Probleme, bestimmte Zeilen meiner ListPreference
zu deaktivieren. Weiß jemand, wie das erreicht werden kann?
Gelöst es.
Ich habe eine benutzerdefinierte Klasse erstellt, die ListPreference
erweitert. Ich habe dann eine benutzerdefinierte ArrayAdapter
verwendet und die Methoden areAllItemsEnabled()
und isEnabled(int position)
verwendet.
und
%Vor%Ich habe überall im Internet recherchiert und konnte keinen Weg finden, dies zu erreichen. Die obige Antwort hat mir nicht geholfen. Ich fand die gesamte "ArrayAdapter" -Methode sehr unintuitiv, nicht hilfreich und schwer zu implementieren.
Schließlich musste ich tatsächlich in den Quellcode von "ListPreference" schauen, um zu sehen, was sie dort gemacht haben, und herausfinden, wie man das Standardverhalten sauber und effizient überschreibt.
Ich teile meine Lösung unten. Ich habe die Klasse "SelectiveListPreference" gemacht, um das Verhalten von "ListPreference" zu erben, aber eine positive Schaltfläche hinzufügen, und schließen, wenn eine Option gedrückt wird. Es gibt auch ein neues XML-Attribut, um anzugeben, welche Optionen in der kostenlosen Version verfügbar sind.
Mein Trick besteht nicht darin, die ListPreference-Version von onPrepareDialogBuilder aufzurufen, sondern stattdessen meine eigene mit einem benutzerdefinierten Click-Handler zu implementieren. Ich musste meinen eigenen Code nicht schreiben, um den ausgewählten Wert beizubehalten, da ich den Code von ListPreference verwendete (deshalb habe ich "ListPreference" und nicht "Preference" erweitert).
Der Handler sucht nach der booleschen Ressource "free_version" und wenn es wahr ist, erlaubt er nur die Optionen, die im XML-Attribut "entry_values_free" angegeben sind. Wenn "free_version" falsch ist, sind alle Optionen erlaubt. Es gibt auch eine leere Methode für Erben, wenn bei der Auswahl einer Option etwas passieren sollte.
Viel Spaß,
Tal
%Vor%BEARBEITEN: wir müssen auch das implementierte onDialogClosed von ListPreference überschreiben (und nichts tun), sonst werden die bewerteten Dinge nicht beibehalten. Hinzufügen:
%Vor%Vielleicht können Sie es tun, indem Sie standardmäßige getView:
überschreibenSchritte:
Erweitern Sie ListPreference
Überschreiben Sie onPrepareDialogBuilder und ersetzen Sie mBuilder in DialogPreference durch ProxyBuilder
Behandle getView in ProxyBuilder- & gt; AlertDialog- & gt; onShow- & gt; getListView- & gt; Adapter
Codebeispiele finden Sie in benutzerdefinierten Zeilen in einer listPreference?
Bei dem gleichen Problem habe ich eine Lösung gefunden (vielleicht ist "hack" besser geeignet). Wir können OnPreferenceClickListener
für ListPreference
registrieren. Innerhalb dieses Listeners können wir den Dialog aufrufen (da die Präferenz geklickt wurde, sind wir ziemlich sicher, dass es nicht null
ist). Mit dem Dialog können wir ein OnHierarchyChangeListener
auf dem ListView
des Dialogs setzen, in dem wir benachrichtigt werden, wenn eine neue Kindansicht hinzugefügt wird. Mit der Kinderansicht können wir sie deaktivieren.
Angenommen, die Einträge ListView
werden in der gleichen Reihenfolge wie die Eingabewerte von ListPreference
erstellt, können wir sogar den Eintragswert erhalten.
Ich hoffe, jemand findet das hilfreich.
%Vor%Tags und Links android