Android:未从PreferenceFragment

时间:2016-12-30 19:46:29

标签: java android android-settings

我再次发布此问题,因为我上次没有得到任何答案,但我仍然无法解决问题。

我有一个带有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来看看发生了什么:

  1. 听众工作正常,在预期时运行

  2. 我的摘要var包含了预期的内容

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

  4. 但是,当我实际按下并查看&#34;排除列表&#34;时,它的摘要实际上并没有更新!

  5. 我错过了什么吗?提前谢谢!

    所有参考代码:

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

2 个答案:

答案 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();