gpt4 book ai didi

android - 共享首选项仅在第一次保存

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:31:07 27 4
gpt4 key购买 nike

该程序第一次创建首选项,但此后它永远不会更改它们。如果能帮助我理解原因,我将不胜感激。

这是调用 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 和一个调用 Activity 来存储电子邮件的首选项。

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

一切都到这里。问题出在名为...的 Activity 中

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 的首选项,那么它会存储所有更改,甚至是我添加的电子邮件。

希望我说清楚了,它有很多代码,因为我想非常明确。感谢您的帮助。

最佳答案

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

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

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

关于android - 共享首选项仅在第一次保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12528836/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com