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 和一个 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>

直到这里的一切。问题出在名为...的活动中

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

经过一个多星期的寻找错误,我发现了它。我认为这对很多有同样问题的人有帮助。

问题是当我调用首选项来获取字符串集时,它只引用列表而不复制它。所以我必须创建一个新列表并添加之前存储的所有元素并添加新元素,然后使用编辑器使用新列表更改首选项。代码是这样的:

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 回答
0

对于存储 Stringset,更好的方法是首先删除最后一个 SharedPreferences 值,然后使用相同的键保存新的值。像这样:

defaultSharedPreferences.edit().remove("keysValue").commit();

defaultSharedPreferences.edit().putStringSet("keysValue",likesset).commit();
于 2018-11-02T16:16:17.933 回答