Android:SharedPreferences 未从 PreferenceFragment 更新
Android: SharedPreferences not getting updated from PreferenceFragment
由于上次没有得到任何答案,我再次发布这个问题,我仍然没有解决问题。
我有一个带有 PreferenceScreen 的设置菜单,在其中我在运行时创建了很多 CheckBoxPreferences(将它们添加到 "Exclusion List" prefscreen)。我创建它们没问题,这是下面的 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 方法中创建复选框并将它们添加到 "Exclusion List" PreferenceScreen 并且工作正常。
我正在尝试将 "Exclusion List" 的摘要设置为所有选中的复选框标题的列表(因此,如果复选框被选中,它的名称将列在摘要中"Exclusion List").
在onCreate()方法中,summary设置正确,没有问题。
但在 onPreferenceChanged() 方法中,我将 "Exclusion List" 的摘要设置为我构建的 'summary' 字符串(包含正确的值),但它不会更新它!当我从复选框菜单中按回键时,"Exclusion List" 没有更新值。
最后几行是感兴趣的。我做了一些 printlns 以查看发生了什么:
侦听器工作正常,按预期运行
我的摘要变量包含预期内容
调用 setSummary(summary) 后,getSummary() returns 预期值(这意味着它已正确设置)
然而,当我实际按下回看 "Exclusion List" 时,它的摘要实际上并没有得到更新!
我错过了什么吗?提前致谢!
全部代码供参考:
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);
}
通过将以下代码行添加到我的 onSharedPreferenceChanged() 方法的末尾使其工作:
((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged();
由于上次没有得到任何答案,我再次发布这个问题,我仍然没有解决问题。
我有一个带有 PreferenceScreen 的设置菜单,在其中我在运行时创建了很多 CheckBoxPreferences(将它们添加到 "Exclusion List" prefscreen)。我创建它们没问题,这是下面的 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 方法中创建复选框并将它们添加到 "Exclusion List" PreferenceScreen 并且工作正常。
我正在尝试将 "Exclusion List" 的摘要设置为所有选中的复选框标题的列表(因此,如果复选框被选中,它的名称将列在摘要中"Exclusion List").
在onCreate()方法中,summary设置正确,没有问题。
但在 onPreferenceChanged() 方法中,我将 "Exclusion List" 的摘要设置为我构建的 'summary' 字符串(包含正确的值),但它不会更新它!当我从复选框菜单中按回键时,"Exclusion List" 没有更新值。
最后几行是感兴趣的。我做了一些 printlns 以查看发生了什么:
侦听器工作正常,按预期运行
我的摘要变量包含预期内容
调用 setSummary(summary) 后,getSummary() returns 预期值(这意味着它已正确设置)
然而,当我实际按下回看 "Exclusion List" 时,它的摘要实际上并没有得到更新!
我错过了什么吗?提前致谢!
全部代码供参考:
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);
}
通过将以下代码行添加到我的 onSharedPreferenceChanged() 方法的末尾使其工作:
((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged();