Aktualisiere existierendes Präferenz-Item in einer PreferenceActivity nach Rückkehr von einem (Sub-) Preferencescreen

8

Ich habe eine PreferenceActivity mit einer Reihe von (Sub) PreferenceScreens. Jeder solcher (Sub) PreferenceScreen repräsentiert ein Konto und hat den Account-Benutzernamen als Titel.

%Vor%

Wenn der Benutzer sub-PreferenceScreen eingibt und den Benutzernamen des Kontos bearbeitet, möchte ich, dass der äußere PreferenceScreen seinen PräferenzScreen-Titel für das betreffende Konto aktualisiert.

Ich habe versucht, hinzuzufügen ...

%Vor%

... aber der accScreen.setTitle scheint auf dem äußeren PreferenceScreen nicht zu wirken. Ich habe bemerkt, dass das Aufrufen von onContentChanged(); es tatsächlich funktioniert, aber ich stelle fest, dass dies wahrscheinlich nicht der bevorzugte Weg ist, dies zu tun.

Ich vermute, ich sollte postInvalidate() irgendwo aufrufen, aber ich kann mir wirklich nicht vorstellen, welche Ansicht und wann ich es machen soll.

PreferenceScreen android: Zusammenfassendes Update! kann das gleiche Problem haben wie ich.

Jede Hilfe wird geschätzt.

    
aioobe 12.04.2010, 20:34
quelle

8 Antworten

16

Ich habe eine Lösung gefunden. Ich habe eine Hierarchie wie diese, jeder von diesen ist ein PreferenceScreen:

%Vor%

In der Benutzerliste hängt der Titel des Unterbildschirms von den Benutzereinstellungen ab. Wenn ich nun die Benutzerliste erstelle, speichere ich den Listenadapter in einer Variablen in meiner PreferenceActivity.

%Vor%

Wenn nun die userX-Einstellungen bearbeitet werden, setze ich die Titel im usersListScreen und nach diesem Aufruf:

%Vor%

aktualisiert die Benutzeroberfläche der Liste und die Änderungen sind sichtbar.

    
Asmo Soinio 18.02.2011, 11:41
quelle
3

notifyDataSetChanged () ist die richtige Lösung. Aber ich möchte einen rekursiven Iterator für alle PreferenceScreens hinzufügen, sofern ich ein Problem habe, ein reales Elternelement einer Präferenz zu finden. Für die komplizierte Struktur der Einstellungen empfehle ich diesen Killer-Code:

%Vor%

Ich rufe es nach jeder setSummary () auf, um sicherzustellen, dass es richtig funktioniert:

%Vor%     
Vadim 04.04.2014 22:07
quelle
1

Ich habe das gleiche Problem, aber onContentChanged () funktioniert nicht für mich. Mein Problem ist mit PreferenceScreens, die mehr als eine Ebene tief von der Wurzel sind.

Um Ihrem Beispiel zu folgen, wenn Sie zuerst einen Preferencescreen "Accounts" erstellt und dann jedes Ihrer individuellen Account PreferenceScreen-Objekte darunter hinzugefügt haben. So:

%Vor%

Wenn ein Benutzer seinen Benutzernamen bearbeitet und auf "Speichern" geklickt hat, wirkt sich der Aufruf von PreferenceActivity.onContentChanged () nur auf direkte Nachkommen des Root-PreferenceScreen aus. Die Titel und Zusammenfassungen der dritten Generation werden nicht neu gezeichnet, sondern spiegeln alte Werte wider.

Wenn man sich den Code von onContentChanged () anschaut, sieht es so aus, als würde es den root-Screen an die ListView-ListActivity binden, obwohl ich nicht glaube, dass nachfolgende PreferenceScreens jemals an eine ListView gebunden sind (oder?) , also können wir nichts manuell neu binden ...

Die einzige Problemumgehung, die ich mir vorstellen kann, wäre, die Untermenüs als isolierte PreferenceActivities anstelle von PreferenceScreens zu erstellen, sodass wir absichtlich OnContentChanged () auf unserem direkten Vorfahren aufrufen können. Aber das ist noch mehr ein Kludn als die aktuelle Problemumgehung. Irgendwelche Ideen?

    
bholbrook 02.05.2010 05:40
quelle
1

PreferenceActivity#onContentChanged() aktualisiert den gesamten Bildschirm, wobei ein Flimmereffekt auftritt.

Sie können jedoch dasselbe Ziel selektiv für eine bestimmte Präferenz mit der Methode PreferenceActivity#onPreferenceTreeClick(...) erreichen.

Beachten Sie, dass diese Methode jetzt veraltet ist: Erwägen Sie die Verwendung von Fragmenten , die eine Menge zu lösen scheinen Probleme mit benutzerdefinierten Einstellungen (ich habe mich selbst noch nicht getestet). Es gibt ein Kompatibilitätspaket für ältere SDKs.

%Vor%     
nicobo 23.03.2012 14:35
quelle
1

Ich setze nur

%Vor%

direkt nach dem Aktualisieren der Zusammenfassung meines übergeordneten Einstellungselements.

    
halxinate 07.03.2013 20:57
quelle
1

Dies könnte eine späte Antwort sein, aber immer noch ... Ich bin gerade dabei:)

Wie ich es erreicht habe, können Sie die Methode onResume () des onResume () des Lebenszyklus verwenden und das erforderliche Feld manuell aktualisieren, indem Sie ihre Werte zurücksetzen .

Hinweis: In diesem Beispiel behalte ich auch den Index der bearbeiteten Voreinstellung im Auge, nur um zu vermeiden, dass jede einzelne zurückgesetzt wird.

%Vor%

Wie in der Dokumentation angegeben:

  

onResume

     

Wird aufgerufen, wenn das Fragment für den Benutzer sichtbar ist und aktiv ausgeführt wird. Dies ist in der Regel an Activity.onResume des Lebenszyklus der enthaltenden Aktivität gebunden.

Was gut ist, ist, dass es natürlich auch mit den FragmentManager Transaktionen funktioniert.

Hoffe das hilft, fröhliche Codierung! :)

    
Romain Kelifa 01.09.2017 08:32
quelle
0

Quelle

%Vor%     
Elvis 24.01.2012 21:18
quelle
-1

Dies funktioniert bei mir, Sie müssen den darunter liegenden Dialog Ihres PreferenceScreens greifen und den Titel von dort aus einfach einstellen.

%Vor%     
int21h 03.01.2012 01:39
quelle