2012-09-21 17 views
5

私はこの問題で3日間、私を殺しています。 プログラムは最初にプリファレンスを作成しますが、その後は変更されません。共有環境設定は初めて保存されただけです

これは、xmlが呼び出されるPreferencesScreenです。

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

環境設定では、私は電子メールを格納するためのアクティビティを呼び出すListPreferenceとPreferenceを持っています。

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

すべてここまでです。私は別の電子メールを追加するとき、私は好みで変更をdoesnt't場合は問題が

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

} 

ポイントは、それが常にうまく最初の時間を保存することである...と呼ばれる活動しているけど。私が追加した電子メールはすべて表示されますが、環境設定ファイルは変更されません(ファイルエクスプローラで確認しているため)。再起動した場合や閉じて再度開いた場合、環境設定は最初に追加したメールのみになります。 問題は、私がListPreferenceのプリファレンスを変更して変更した場合、追加した電子メールの変更もすべて保存することです。

希望していたので、私は非常に明示したいので、コードがたくさんあります。 ありがとうございました。

+0

。 prefShared = getApplicationContext()。getSharedPreferences( "com.example.daemon3_preferences"、MODE_PRIVATE);同じ結果の – Alberto

答えて

14

間違いを探して1週間以上経った後、私はそれを見つけました。 これは、同じ問題を抱えている多くの人に役立つと思います。

問題は、環境設定を呼び出して文字列セットを取得するときに、リストを参照するだけで、そのコピーを作成しないということでした。だから私は新しいリストを作成し、以前に保存されたすべての要素を追加し、新しい要素を追加してから、エディタで新しいリストで環境設定を変更する必要があります。 コードは次のようである:私は、環境設定=のPreferenceManager.getDefaultSharedPreferences(getApplicationContext())を変更しようとした

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

私がしたことは 'Set list = new HashSet (prefs.getStringSet(" emailWrongs "、null);')のようなものだったし、 'list'と' putStringSet(... ' – RTF

+0

あなたは命の恩人です – hellowill89

+0

この問題で二日を無駄にしました、ありがとう。 –

関連する問題