Zeilen in ListPreference deaktivieren

8

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?

    
Adam Smith 10.03.2012, 02:04
quelle

4 Antworten

6

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.

%Vor%

und

%Vor%     
Adam Smith 10.03.2012 11:22
quelle
0

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%     
TalL 30.07.2012 10:56
quelle
0

Vielleicht können Sie es tun, indem Sie standardmäßige getView:

überschreiben

Schritte:

  1. Erweitern Sie ListPreference

  2. Überschreiben Sie onPrepareDialogBuilder und ersetzen Sie mBuilder in DialogPreference durch ProxyBuilder

  3. Behandle getView in ProxyBuilder- & gt; AlertDialog- & gt; onShow- & gt; getListView- & gt; Adapter

Codebeispiele finden Sie in benutzerdefinierten Zeilen in einer listPreference?

    
galex 24.11.2013 12:34
quelle
0

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%     
Simikolon 25.03.2014 15:53
quelle

Tags und Links