我再次发布此问题,因为我上次没有得到任何答案,但我仍然无法解决问题。
我有一个带有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方法中创建复选框,并将它们添加到&#34;排除列表&#34; PreferenceScreen,工作正常。
我试图设置&#34;排除列表&#34;的摘要。作为已选中的所有复选框标题的列表(因此,如果选中该复选框,则其名称将列在&#34;排除列表&#34的摘要中;)。
在onCreate()方法中,摘要设置正确,没有问题。
但是在onPreferenceChanged()方法中,我设置了&#34;排除列表&#34;的摘要。总结&#39;我构建的字符串(包含正确的值),但它没有更新它!当我从复选框菜单中按回来时,&#34;排除列表&#34;没有更新的值。
最后几行是感兴趣的。我做了一些printlns来看看发生了什么:
听众工作正常,在预期时运行
我的摘要var包含了预期的内容
调用setSummary(summary)后,getSummary()返回预期值(这意味着它已正确设置)
但是,当我实际按下并查看&#34;排除列表&#34;时,它的摘要实际上并没有更新!
我错过了什么吗?提前谢谢!
所有参考代码:
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
}
}
}
}
答案 0 :(得分:0)
尝试在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);
}
答案 1 :(得分:0)
通过在我的onSharedPreferenceChanged()方法的末尾添加以下代码行来实现它:
((BaseAdapter)getPreferenceScreen().getRootAdapter()).notifyDataSetChanged();