gpt4 book ai didi

java - Android:SharedPreferences 未从 PreferenceFragment 更新

转载 作者:太空宇宙 更新时间:2023-11-04 11:55:51 26 4
gpt4 key购买 nike

我再次发布这个问题,因为我上次没有得到任何答案,而且我仍然没有解决问题。

我有一个带有 PreferenceScreen 的设置菜单,在运行时我在其中创建了大量 CheckBoxPreferences(将它们添加到“排除列表”预屏幕中)。我创建它们没有问题,下面是它开头的 XML 代码:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen
android:key="exclusion_list_key"
android:title="Exclusion List"
android:persistent="true"
android:summary="" >
</PreferenceScreen>
</PreferenceScreen>

我在 PreferenceFragment 的 onCreate 方法中创建了复选框,并将它们添加到“排除列表”PreferenceScreen 中,效果很好。

我试图将“排除列表”的摘要设置为所有已选中的复选框标题的列表(因此,如果选中该复选框,其名称将列在“排除列表”的摘要中)。

在onCreate()方法中,摘要设置正确,没有问题。

但是在 onPreferenceChanged() 方法中,我将“排除列表”的摘要设置为我构建的“摘要”字符串(其中包含正确的值),但它没有更新它!当我从复选框菜单中按返回时,“排除列表”没有更新的值。

最后几行是我们感兴趣的几行。我做了一些 printlns 来看看发生了什么:

  1. 监听器工作正常,按预期运行

  2. 我的摘要变量包含预期内容

  3. 调用 setSummary(summary) 后,getSummary() 返回预期值(这意味着它已正确设置)

  4. 但是,当我实际按回并看到“排除列表”时,它的摘要实际上并未更新!

我是不是错过了什么?提前致谢!

所有代码供引用:

public class Settings extends AppCompatActivity {

public static final String EXC_LIST_KEY = "exclusion_list_key";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
}

public static class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
String summary = "";

//Create all the checkboxes inside of the PreferenceScreen
for (int i = 0; i < MainActivity.contactNames.length; i++) {
CheckBoxPreference checkbox = new CheckBoxPreference(getActivity());
checkbox.setTitle(MainActivity.contactNames[i][0]);
checkbox.setKey(MainActivity.contactNames[i][2]);
checkbox.setSummary(MainActivity.contactNames[i][1]);
checkbox.setDefaultValue(false);
((PreferenceScreen) findPreference(EXC_LIST_KEY)).addPreference(checkbox);
if (checkbox.isChecked()) {
summary = summary + checkbox.getTitle() + "\n";
}
}
findPreference(EXC_LIST_KEY).setSummary(summary);
getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
//Checkbox keys all start with 'key_'
if (key.startsWith("key_")) {
String summary = "";
for (int i = 0; i < MainActivity.contactNames.length; i++) {
CheckBoxPreference checkbox = (CheckBoxPreference) findPreference(MainActivity.contactNames[i][2]);
if (checkbox.isChecked()) {
summary = summary + checkbox.getTitle() + "\n";
}
}
System.out.println("Summary I have: " + summary); //Correct summary is printed out
findPreference(EXC_LIST_KEY).setSummary(summary); //Isn't updating the value???
System.out.println("Summary system has: " + findPreference(EXC_LIST_KEY).getSummary()); //Correct summary is printed out
}
}
}
}

最佳答案

尝试在您的SettingsFragment中添加此代码

 @Override
public void onResume() {
super.onResume();

SharedPreferences prefs = getPreferenceManager().getSharedPreferences();

// CHANGE 1: load saved values to set the summaries
onSharedPreferenceChanged(prefs, "exclusion_list_key");

// CHANGE 2: register shared prefs listener in onResume
prefs.registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onPause() {
super.onPause();
SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
prefs.unregisterOnSharedPreferenceChangeListener(this);
}

关于java - Android:SharedPreferences 未从 PreferenceFragment 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41401894/

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