android - 是否可以在不使用 XML 资源的情况下使用 PreferenceFragment 创建首选项屏幕?

标签 android xml fragment preferences preferenceactivity

我目前能够使用 PreferenceFragment 创建一个偏好屏幕,在其中我使用以下方式分配我的偏好:

addPreferencesFromResource(R.xml.preferences);

我不想使用资源“R.xml.preferences”,而是使用我已经保存的 SharedPreferences,例如:

SharedPreferences prefs = this.getActivity().getSharedPreferences("preferences", 0);

addPreferencesFromResource(prefs);

但是,这不起作用。是否有可能做到这一点?如果是这样,如何?还是要求我使用 xml 文档?

最佳答案

我碰巧遇到了完全相同的问题,但我想通了,希望这对您有所帮助。

您需要执行以下步骤才能在不使用 XML Reouser 的情况下添加自定义首选项

首先: 您需要创建一个 Preference Screen,正如它所说的“屏幕”,它可以包含多个 Preferences 并且必须链接到您的 PreferenceFragment 或 PreferenceActivity。 例如考虑以下 PreferenceFragment(并考虑它包含在高级 Activity 中..)

public static class YourPreferenceFragment extends PreferenceFragment implements OnSharedPreferenceChangeListener {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        PreferenceScreen p = createPreferences();
        this.setPreferenceScreen(p);//Set the PreferenceScreen as the current one on this fragment

        //now bind values, notice we use p.findPreference which means whe look into the preferenceScreen Associated with the PreferenceFragment/Activity
        bindPreferenceSummaryToValue(p.findPreference("some_key"));
    }
}

现在考虑 createPreferences 是一种方法,它将返回一个 PreferenceScreen 以及您的自定义首选项,例如 ListPreference 或 CheckboxPreference。这就是您真正创建首选项并将它们添加到 PreferenceScreen 的方式

private PreferenceScreen createPreferences()
    {
        PreferenceScreen p =
        getPreferenceManager().createPreferenceScreen(getActivity());

        ListPreference listPref = new ListPreference(getActivity());

        listPref.setKey("some_key"); //Refer to get the pref value
        CharSequence[] csEntries = new String[]{"Item1","Item2"};
        CharSequence[] csValues = new String[]{"1","2"};
        listPref.setDefaultValue(-1);
        listPref.setEntries(csEntries); //Entries(how you display them)
        listPref.setEntryValues(csValues);//actual values
        listPref.setDialogTitle("Dialog title");
        listPref.setTitle("Title");
        listPref.setSummary("Some summary");

        p.addPreference(listPref);

        return p;
    }

如果有帮助,请告诉我 最好的,

编辑:bindPreferenceSummaryToValue 的代码

private static void bindPreferenceSummaryToValue(Preference preference) {
    // Set the listener to watch for value changes.
    preference.setOnPreferenceChangeListener(sBindPreferenceSummaryToValueListener);

    // Trigger the listener immediately with the preference's
    // current value.


    if (preference instanceof CheckBoxPreference) {
        sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, PreferenceManager.
                getDefaultSharedPreferences(preference.getContext()).
                getBoolean(preference.getKey(),false));

    } else {
        sBindPreferenceSummaryToValueListener.onPreferenceChange(preference, PreferenceManager.
                getDefaultSharedPreferences(preference.getContext()).
                getString(preference.getKey(),""));
    }

}

关于android - 是否可以在不使用 XML 资源的情况下使用 PreferenceFragment 创建首选项屏幕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14942803/

相关文章:

java - Android Id 及其可靠性

Android Firebase 无法将 java.util.HashMap 类型的值转换为字符串

java - 在Java中追加字符串并添加 "..."

javascript - Angular 表达式能否呈现 XML 节点属性,尽管 [$parse :isecdom] Referencing DOM nodes in Angular expressions is disallowed

iphone - XML文件怎么写?

android - 我无法在 fragment 中使用 kotlin 定义 supportFragmentManager

android - 将 ListActivity 转换为 ListFragment

android - android中带有复选框错误的自定义 ListView

java - Android 重量和布局宽度

android - runtimeexception :unable to destroy activity and RuntimeException:. nosuchfieldexception: mChildfragmentManager