Mettre à jour l'élément de préférence existant dans une PréférenceActivité lors du retour d'un (sous) Préférence Écran

J'ai une PreferenceActivity avec un tas de (Sub) PreferenceScreens. Chacun de ces (Sub) PreferenceScreen représente un compte et possède le compte-nom d'utilisateur comme titre.

PreferenceScreen root = mgr.createPreferenceScreen(this); for (MyAccountClass account : myAccounts) { final PreferenceScreen accScreen = mgr.createPreferenceScreen(this); accScreen.setTitle(account.getUsername()); // add Preferences to the accScreen // (for instance a "change username"-preference) ... root.add(accScreen); } 

À mesure que l'utilisateur entre sous-Préférence Écran et édite le nom d'utilisateur du compte, je souhaite que le PreferenceScreen extérieur mette à jour son PreferenceScreen-title pour le compte en question.

  • SharedPreferences sont parfois supprimés
  • Quelle est la meilleure façon de sauvegarder le contenu d'un ArrayList?
  • Comment mettre en place des bannières publicitaires AirPush?
  • Notifications Push lorsque l'application est fermée
  • Puis-je écouter les événements tactiles Android?
  • Puis-je créer des applications Android avec une réaction native?
  • J'ai essayé d'ajouter …

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

    … mais l'accScreen.setTitle ne semble pas prendre effet sur le PreferenceScreen externe. Je note que l'appel onContentChanged(); En fait, ça marche, mais je me rends compte que ce n'est probablement pas la façon préférée de le faire.

    Je soupçonne que je devrais appeler postInvalidate() sur une certaine vue quelque part, mais je ne peux vraiment pas comprendre la vue et le moment de le faire.

    PreferenceScreen android: mise à jour récapitulative! Je ressens le même problème que moi.

    Toute aide appréciée.

    7 Solutions collect form web for “Mettre à jour l'élément de préférence existant dans une PréférenceActivité lors du retour d'un (sous) Préférence Écran”

    J'ai trouvé une solution à cela. J'ai une hiérarchie comme celle-ci, chacun d'eux est un PreferenceScreen:

     main settings -> users list -> user1 settings -> user2 settings ... 

    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 des utilisateurs, je stocke l'adaptateur de liste sur une variable dans mon PréférenceActivité.

      PreferenceScreen usersListScreen = ... userScreenListAdapter = (BaseAdapter)usersListScreen.getRootAdapter(); 

    Maintenant, lorsque les paramètres utilisateurX sont édités, je définis les titres dans l'écran UserListScreen et après cet appel:

     userScreenListAdapter.notifyDataSetChanged(); 

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

    NotifyDataSetChanged () est la bonne solution. Mais je veux ajouter un itérateur récursif pour tous les PreferenceScreens, dans la mesure où j'ai eu un problème pour trouver un véritable parent d'une préférence. Pour une structure complexe de Préférences, je recommande ce code-tueur:

     private void updateAll_PrefereneScreens(PreferenceGroup group) { if (group instanceof PreferenceScreen) { BaseAdapter adapter = (BaseAdapter) ((PreferenceScreen) group).getRootAdapter(); adapter.notifyDataSetChanged(); } for (int i=0; i<group.getPreferenceCount(); i++) { Preference pref = group.getPreference(i); if (pref instanceof PreferenceGroup) { updateAll_PrefereneScreens((PreferenceGroup) pref); } } } 

    Je l'appelle après chaque setSummary () pour s'assurer qu'il fonctionne correctement:

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

    Expérimenter ce même problème, mais onContentChanged () ne fonctionne pas pour moi. Mon problème concerne PreferenceScreens qui sont à plus d'un niveau de la racine.

    Pour suivre votre exemple, si vous avez créé un PreferenceScreen "Accounts", vous avez ajouté chacun de vos objets PreferenceScreen individuels. Comme ça:

     Écran racine
       -> écran "Comptes"
         -> écran "foo@example.com"
           -> éditer le nom d'utilisateur
           -> éditer le mot de passe
           -> etc ...
         -> écran "bar@example.com"
         -> écran "baz@example.com"
         -> etc ...
    

    Si un utilisateur a édité son nom d'utilisateur et a sauvegardé un clic, appeler PreferenceActivity.onContentChanged () semble affecter uniquement les descendants directs de l'PreferenceScreen racine. Les titres et les résumés des écrans de la troisième génération ne sont pas redessinés, reflétant encore les anciennes valeurs.

    En regardant le code de onContentChanged (), il semble qu'il suffit de lier () s l'écran racine à ListView de ListActivity, même si je ne pense pas que les PreferenceScreens ultérieurs sont liés à un ListView (sont-ils?), Alors nous Ne peut pas relier manuellement n'importe quoi …

    La seule solution que je puisse penser serait de créer les sous-menus comme PreferenceActivity isolés au lieu de PreferenceScreens, afin que nous puissions appeler intentionnellementContentChanged () sur notre ancêtre direct. Mais c'est encore plus un kludge que la solution de contournement actuelle. Des idées?

    PreferenceActivity#onContentChanged() actualisera l'écran entier, produisant un effet de scintillement .

    Cependant, vous pouvez atteindre le même objectif sélectivement sur une préférence donnée avec la méthode PreferenceActivity#onPreferenceTreeClick(...) .

    Notez que cette méthode est maintenant obsolète: envisagez d'utiliser des fragments qui semblent résoudre beaucoup de problèmes avec les préférences personnalisées (je ne me suis pas encore testé). Il existe un package de compatibilité pour un SDK plus ancien.

     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 } 

    Je mets juste

     ((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged(); 

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

    La source

     // Import required classes (Win: CTRL+SHIFT+O & Mac: CMD+SHIFT+O) public class YourCustomPreference extends PreferenceActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Load the preferences from an XML resource addPreferencesFromResource(R.xml.preferences); } // some logic goes above, when you want to reset value and update // EditTextPreference value. For convenience, I am going to wrap two // different task in different methods private void resetPreferenceValue() { SharedPreferences sharedPref = PreferenceManager .getDefaultSharedPreferences(this.getApplicationContext()); // Get preference in editor mode SharedPreferences.Editor prefEditor = sharedPref.edit(); // set your default value here (could be empty as well) prefEditor.putString("your_edit_text_pref_key", "DEFAULT-VALUE"); prefEditor.commit(); // finally save changes // Now we have updated shared preference value, but in activity it // still hold the old value this.resetElementValue(); } private void resetElementValue() { // First get reference to edit-text view elements EditTextPreference myPrefText = (EditTextPreference) super .findPreference("your_edit_text_pref_key"); // Now, manually update it's value to default/empty myPrefText.setText("DEFAULT-VALUE"); // Now, if you click on the item, you'll see the value you've just // set here } } 

    Cela fonctionne pour moi, vous devez saisir le dialogue sous-jacent de votre PreferenceScreen et définir le titre à partir de là, vraiment facile.

     somePrefScreen.getDialog().setTitle("Whatever you want"); 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.