2012-09-21 45 views
5

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.Preferencias compartidas solo guardadas la primera vez

Esta es la pantalla de preferencias 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 se almacena bien la primera vez, pero si cuando agrego otro email las preferencias doesnt't cambio. Parece que cambian porque si los imprimo muestran todos los correos electrónicos que agrego, pero el archivo de preferencias no cambia (verificándolo en el Explorador de archivos). Y si reinicio o cierro y abro de nuevo, las preferencias son solo con el primer correo electrónico que agregue. El asunto es si vuelvo y cambio la preferencia de ListPreference, entonces almacena todos los cambios incluso los correos electrónicos que agregué.

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

+0

I intentado cambiar prefs = PreferenceManager.getDefaultSharedPreferences (getApplicationContext()); línea para prefShared = getApplicationContext(). getSharedPreferences ("com.example.daemon3_preferences", MODE_PRIVATE); con el mismo resultado. – Alberto

Respuesta

14

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 fue que cuando llamo a las preferencias para obtener el Conjunto de Cadenas, solo hace referencia a la lista y no hace 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();  
} 
+1

Lo que hice fue algo así como 'Establecer list = new HashSet (prefs.getStringSet (" emailWrongs ", null);' y luego simplemente hacer los cambios en 'list' y' putStringSet (... 'cuando estés hecho – RTF

+0

usted es un salvavidas – hellowill89

+0

perdido dos días en este tema, gracias. –

Cuestiones relacionadas