我目前能够使用PreferenceFragment创建一个首选项屏幕,我在其中使用以下命令分配首选项:
addPreferencesFromResource(R.xml.preferences);
我不想使用资源'R.xml.preferences',而是想使用我已保存的SharedPreferences,例如:
SharedPreferences prefs = this.getActivity().getSharedPreferences("preferences", 0);
addPreferencesFromResource(prefs);
然而,这不起作用。是否有可能做到这一点?如果是这样,怎么样?或者我需要使用xml文档吗?
答案 0 :(得分:1)
我碰巧遇到了完全相同的问题,但我想出来了,希望这会有所帮助。
您需要执行以下步骤才能在不使用XML Reouser的情况下添加自定义首选项
第一: 您需要创建一个首选项屏幕,这就像它说的“屏幕”一样,它可以包含多个首选项,并且必须链接到您的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是一种方法,它将使用您的自定义首选项(如ListPreference或CheckboxPreference)返回PreferenceScreen。这是您真正创建首选项并将其添加到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(),""));
}
}