6

プログラムは最初に環境設定を作成しますが、その後は決して変更しません。理由を理解するための支援をいただければ幸いです。

これは、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 と、アクティビティを呼び出してメールを保存する設定があります。

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

ここまで全部。問題は、と呼ばれる活動にあります...

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 の設定に戻って変更すると、追加したメールも含めてすべての変更が保存されることです。

非常に明確にしたかったので、多くのコードがあります。お手伝いありがとう。

4

2 に答える 2

14

間違いを探して1週間以上経った後、私はそれを見つけました。同じように悩んでいる多くの方の参考になればと思います。

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

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();      
}
于 2012-09-27T08:10:12.550 に答える