Las preferencias compartidas sólo se guardan por primera vez

He estado 3 días con este problema y me está matando. El programa crea las preferencias la primera vez pero después de eso nunca las cambia.

Esta es la PreferencesScreen donde se llama al xml.

public class PreferencesScreen extends PreferenceFragment{ private final String TAG = "PreferencesScreen"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "OnCreate"); addPreferencesFromResource(R.xml.prefs); } 

En las preferencias tengo una ListPreference y una Preferencia que llama a una actividad para almacenar correos electrónicos.

 <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <PreferenceCategory android:title="Information Collected"> <ListPreference android:key="loggins" android:title="Logs Stored" android:summary="Choose the top kind of logs do you want to store." android:dialogTitle="Choose Logs" android:entries="@array/logs" android:entryValues="@array/logsValues"/> </PreferenceCategory> <PreferenceCategory android:title="Email Configurations"> <Preference android:key="pushing" android:title="The Email Activity" android:summary="Just push"> <intent android:action = "ADDING_EMAIL"/> </Preference> </PreferenceCategory> </PreferenceScreen> 

Todo hasta aquí. Los problemas están en la actividad llamada …

 public class AddingEmail extends ListActivity implements OnClickListener{ private Set<String> emails; private EditText emailAdd; SharedPreferences.Editor editor; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.addingemail); Button add = (Button) findViewById(R.id.add); emailAdd = (EditText) findViewById(R.id.email); prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); editor = prefs.edit(); prefList = toArrayList(prefs.getStringSet("emailWrongs", null)); add.setOnClickListener(this); } public void onClick(View v) { Set<String> list = prefs.getStringSet("emailWrongs", null); String newEmail = emailAdd.getText().toString(); if (list==null){ //first time the preferences are called. emails = new TreeSet<String>(); editor.putStringSet("emailWrongs", emails); editor.apply(); } if (newEmail != ""){ emails=prefs.getStringSet("emailWrongs", null); emails.add(newEmail); editor.putStringSet("emailWrongs", emails); editor.apply(); } } } 

El punto es que siempre almacena la primera vez bien pero si yo cuando agrego otro correo electrónico las preferencias no cambian. Parece que cambian porque si los imprimo muestran todos los correos que agrego pero el archivo de preferencia no cambia (Comprobándolo en el Explorador de archivos). Y si reinicio o cerrar y abrir de nuevo, las preferencias son sólo con el primer correo electrónico que añado. La cosa es si vuelvo a y cambiar la preferencia de la ListPreference, a continuación, almacena todos los cambios, incluso los correos electrónicos que he añadido.

Espero que estaba claro, tiene un montón de código porque quería ser muy explícito. Gracias por la ayuda.

    One Solution collect form web for “Las preferencias compartidas sólo se guardan por primera vez”

    Después de más de una semana buscando el error lo encontré. Creo que esto puede ser útil para muchas personas que tuvieron el mismo problema.

    El problema era que cuando llamo a las preferencias para obtener el Conjunto de Cuerdas, sólo hace referencia a la lista y no hacer una copia de la misma. Así que tengo que crear una nueva lista y agregar todos los elementos almacenados antes y también agregar el nuevo elemento y luego con el editor cambiar las preferencias con la nueva lista. El código es así:

     Set<String> list = prefs.getStringSet("emailWrongs", null); Set<String> newList = new TreeSet<String>(); String newEmail = emailAdd.getText().toString(); if (newEmail != ""){ if (list != null){ for(String each: list){ newList.add(each); } } newList.add(newEmail); editor.putStringSet("emailWrongs", newList); editor.apply(); } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.