9
votes

Mettre à jour l'élément de préférence existant dans une préfecture de préférence lors du retour d'une (sous) PréférencesCrean

J'ai une préférence avec un tas de préférences (sous). Chacune (SUB) PréférencesCreen représente un compte et a le nom d'utilisateur de compte comme titre.

usernamePref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        accScreen.setTitle(newValue.toString());
        return true;
    }
});


0 commentaires

8 Réponses :


1
votes

expérimenter ce même problème, mais onContentChanged () ne fonctionne pas pour moi. Mon problème est avec les préférencesCreens plus d'un niveau profond de la racine.

Pour suivre votre exemple, si vous avez créé des préférences de "comptes", puis a ajouté chacun de vos préférences de votre compte individuel. Comme ceci: xxx

Si un utilisateur a modifié leur nom d'utilisateur et cliqué sur Enregistrer, appeler préfévereActivity.oncontenTchanged () semble affecter uniquement les descendants directs des préférences racines. Les titres et les résumés des écrans de troisième génération ne sont pas redessinés, reflétant toujours les valeurs anciennes.

regardant par le code de oncontentChanged (), on dirait qu'il suffit de retirez () s l'écran racine à La liste de liste de liste de liste, bien que je ne pense pas que les préférences ultérieures soient toujours liées à une liste de liste (sont-elles?), nous ne pouvons donc renoncer manuellement rien ...

Le seul échelonnage que je peux penser de créerait les sous-menus comme des préférées isolées au lieu de préférencesCreens, afin que nous puissions appeler intentionnellement onContentChanged () sur notre ancêtre direct. Mais c'est encore plus d'un kludge que la solution de contournement actuelle. Des idées?


2 commentaires

Le travail autour que j'ai réussi à le faire fonctionner est de surcharger la méthode ONRESUME et de reconstruire l'interface utilisateur à l'intérieur.


Aioobe, pourriez-vous montrer un exemple de code sur la façon dont vous faites cela?



16
votes

J'ai trouvé une solution à cela. J'ai une hiérarchie comme celle-ci, chacune d'entre elles est une préférenceCrean: xxx p> dans la liste des utilisateurs, le titre du sous-écran dépend des paramètres de l'utilisateur. Maintenant, lorsque je crée la liste d'utilisateurs, je stocke l'adaptateur de liste à une variable de ma préfenceActivité. xxx

Maintenant, lorsque les paramètres userx sont modifiés, j'ai défini les titres dans les utilisateursListscreen et après cet appel: xxx

qui met à jour l'interface utilisateur de la liste et les modifications sont visibles.


2 commentaires

Wow, sonne comme la voie à suivre. Je n'ai pas l'Android SDK installé pour le moment, mais je vais prendre votre parole pour cela ça marche. Super!


Cela rétablira également toutes les modifications apportées à des préférences dans le fragment de préférence (par exemple, aux auditeurs) après appel! (ou dans d'autres changements de mots fabriqués à partir de l'appelant jusqu'à ce qu'il finira la vue de reconstruction sera perdu :))



-1
votes

Cela fonctionne pour moi, vous devez saisir la boîte de dialogue sous-jacente de vos préférencesCrean et définir le titre de là, vraiment facile. XXX


0 commentaires

0
votes

0 commentaires

1
votes

PréférencesActivitectivité # OnContentChanged () Code> Rafraîchra l'écran entier, survenant à un autre effet de scintillement em> fort>. Cependant, vous pouvez atteindre le même objectif sélectivement fort> sur une préférence donnée avec le Préférences # onperencereClick (...) code> méthode. P>

Notez que cette méthode est maintenant obsolète: envisagez d'utiliser fragments qui semble résoudre beaucoup de problèmes avec des préférences personnalisées (je n'ai pas testé moi-même). Il y a un package de compatibilité pour l'ancien SDK. P>

public void onSharedPreferenceChanged(SharedPreferences preferences, String key) {

Log.v(TAG, "onSharedPreferenceChanged(...," + key + ")");

if (key.equals("myPref")) {
    onPreferenceTreeClick(getPreferenceScreen(), getPreferenceManager().findPreference("myPref"));
    Log.v(TAG, "Do whatever else you need...");
}

//onContentChanged();    // this could be used but occurs screen flickering
}


1 commentaires

Eh bien, devinez quoi ... ils ont laissé des préférences hors de la bibliothèque de support !! Ainsi, pour les niveaux d'API plus anciens, vous devez toujours aller avec la préférence :(



1
votes

Je viens de mettre xxx

juste après la mise à jour du résumé de mon élément de préférence parent.


1 commentaires

Il n'y a pas de gistroottadapter sur le support lib



3
votes

notifydatasetchanged () strong> est la bonne solution. Mais je veux ajouter un itérateur récursif pour toutes les préférencesCreens, dans la mesure où j'ai eu un problème pour trouver un véritable parent d'une préférence. Pour une structure compliquée de préférences, je recommande ce codeur-Code:

findPreference("KEY").setSummary(str);
updateAll_PrefereneScreens(getPreferenceScreen());


0 commentaires

2
votes

Cela pourrait être une réponse tardive mais toujours ... je suis sur elle en ce moment :)

La façon dont je l'ai atteint, est que vous pouvez accrocher à la préférencesFragmentCompat 's Strong> OnResume () Méthode de son cycle de vie et mettez à jour manuellement le champ requis en réinitialisant leurs valeurs.

Remarque: Dans cet exemple, je garde aussi une trace de l'index de la préférence éditée, juste pour éviter de réinitialiser chaque single. xxx

tel que spécifié dans la DOCS:

OnResume

appelé lorsque le fragment est visible pour l'utilisateur et fonctionnant activement. Ceci est généralement lié à l'activité.Resume du cycle de vie de l'activité contenant.

est bon, c'est que cela fonctionne aussi bien sûr avec FragmentManager 'S transactions .

J'espère que cela aide, codage heureux ! :)


0 commentaires