是否可以在不使用 XML 资源的情况下使用 PreferenceFragment 创建首选项屏幕?
Posted
技术标签:
【中文标题】是否可以在不使用 XML 资源的情况下使用 PreferenceFragment 创建首选项屏幕?【英文标题】:Is it possible to create a preference screen with PreferenceFragment without using an XML resource? 【发布时间】:2013-02-03 06:25:03 【问题描述】:我目前能够使用 PreferenceFragment 创建一个偏好屏幕,在其中我使用以下方式分配我的偏好:
addPreferencesFromResource(R.xml.preferences);
我想使用我已经保存的 SharedPreferences,而不是使用资源“R.xml.preferences”,例如:
SharedPreferences prefs = this.getActivity().getSharedPreferences("preferences", 0);
addPreferencesFromResource(prefs);
但是,这不起作用。是否有可能做到这一点?如果是这样,如何?还是需要我使用xml文档?
【问题讨论】:
【参考方案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 是一种返回 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(),""));
【讨论】:
以上是关于是否可以在不使用 XML 资源的情况下使用 PreferenceFragment 创建首选项屏幕?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不同步的情况下使用 Delphi (Pre Delphi 2010) 版本更新 GUI 控件
如何在不捕获MissingManifestResourceException的情况下知道是否找不到资源文件