2012-09-21 7 views
5

Sono stato 3 giorni con questo problema e mi sta uccidendo. Il programma crea le preferenze la prima volta, ma dopo non le cambia mai.Le preferenze condivise vengono salvate solo la prima volta

Questa è la schermata delle preferenze in cui viene chiamato 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); 
} 

Nelle preferenze ho un ListPreference e un Preference che chiama un'attività per memorizzare le email.

<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> 

Tutto fino a qui. I problemi sono in attività denominata ...

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(); 
    } 
} 

} 

Il punto è che memorizza sempre la prima volta bene, ma se io quando aggiungo un'altra email le preferenze doesnt't cambiamento. Sembra che cambino perché se li stampo mostrano tutte le email che aggiungo ma il file delle preferenze non cambia (controllandolo in Esplora file). E se riavvio o chiudo e apro di nuovo, le preferenze sono solo con la prima email che aggiungo. La cosa è se io ritorno a e cambio la preferenza di ListPreference, quindi memorizza tutte le modifiche anche le e-mail che ho aggiunto.

Spero di essere stato chiaro, ha un sacco di codice perché volevo essere molto esplicito. Grazie per l'aiuto.

+0

Ho provato a cambiare prefs = PreferenceManager.getDefaultSharedPreferences (getApplicationContext()); linea per prefShared = getApplicationContext(). getSharedPreferences ("com.example.daemon3_preferences", MODE_PRIVATE); con lo stesso risultato. – Alberto

risposta

14

Dopo più di una settimana in cerca dell'errore l'ho trovato. Penso che questo possa essere utile per molte persone che hanno avuto lo stesso problema.

Il problema era che quando chiamo le preferenze per ottenere il set di stringhe, fa riferimento solo all'elenco e non ne faccio una copia. Quindi devo creare una nuova lista e aggiungere tutti gli elementi memorizzati prima e aggiungere anche il nuovo elemento e poi con l'editor modificare le preferenze con la nuova lista. Il codice è simile:

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

Quello che ho fatto è stato qualcosa di simile a 'Set list = new HashSet (prefs.getStringSet ("emailWrongs", null);' e poi basta apportare le modifiche a 'list' e' putStringSet (... 'quando sei fatto – RTF

+0

Sei un vero toccasana – hellowill89

+0

Sprecato due giorni su questo numero, grazie –