在我的应用程序中,我有偏好:“pref1”,可能的值为0,1,2。我在SharedPreferences
类的帮助下持有它们。
我想提供一个用户界面来改变它。我使用SettingFragment extends PreferenceFragment
root创建了类PreferenceScreen
和xml文件。在xml文件中,我必须设置android:key
字段来绑定UI和SharedPreferences
。
要在用户更改“pref1”后更改我的应用行为,我必须实施OnSharedPreferenceChangeListener
。
同样在程序开始时我需要获得“pref1”的值, 根据保存的偏好同步程序状态。
因此,当我想要添加/删除/修改我的应用程序设置单位时,我应该更改3个地方。看起来很糟糕另一种选择是编写一个class
,其成员变量为SharedPreferences
类型,并隐藏所有SharedPreferences
键,并提供简单的set / get方法来获取首选项。但在这种情况下,我必须使用Android UI的普通工具:布局。
所以,如果没有将关于首选项存储的内部结构(键的名称,默认值,它们的类型)的知识传播到几个地方,就可以使用PreferenceFragment
,
或者更好地使用普通布局?
答案 0 :(得分:2)
正如您在问题中已经强调的那样,基于SharedPreference
的设置的3个部分正在定义 -
1. UI布局,供用户查看和更改设置。
2.收听设置更改。
3.初始化UI时读取设置。
在不影响功能的情况下,您实际上无法取消任何部件。但是,您可以以某种方式排列代码,以便在您想要添加新设置时最小化必须修改的文件(或代码中的位置)的数量。您无法删除UI building
部分。但是,侦听和阅读设置值可以包含在全局可访问的Singleton中(来自您的任何地方)。您可以在App初始化时初始化此单个,并且可以使用简单的set / get接口。您仍然需要定义某种接口,以便您可以监听更改。让单例类具有API来设置/删除这些接口。消费者可以设置/删除这些界面,您可以决定界面应该是什么样的。
答案 1 :(得分:0)
您不需要在PreferenceFragment中为首选项设置单独的共享首选项键。如果您将其指定为持久性(android:persistent = true),Android框架会自动将其保存在共享首选项中。默认情况下,持久标志为true。 根据文档:
PreferenceFragment将Preference对象的层次结构显示为列表。 这些首选项将自动保存为SharedPreferences 用户与他们互动。
对于您的情况,您可以使用列表首选项
<ListPreference
android:key="pref1"
android:title="title"
android:summary="description"
android:entries="@array/entries_list_preference"
android:entryValues="@array/entryvalues_list_preference"
android:defaultValue="1"
android:dialogTitle="dialog title" />
请注意,defaultvalue应为entryvalues_list_preference元素。
如果您必须在首选项值更改时执行某些特定功能 那么你需要添加首选项更改监听器。
ListPreference preference1 =(ListPreference)findPreference(&#34; pref1&#34;);
ListPreference preference1 = (ListPreference) findPreference ("pref1");
performAction(preference1.getValue());
preference1.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
/**
* Called when a Preference has been changed by the user. This is
* called before the state of the Preference is about to be updated and
* before the state is persisted.
*
* @param preference The changed Preference.
* @param newValue The new value of the Preference.
* @return True to update the state of the Preference with the new value.
*/
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
performAction(String.valueOf(newValue));
return true;
}
});
private void performAction(String type) {
switch (type){
case "0": // when 0 value is selected
break;
case "1": //when 1 value is selected
break;
case "2": //when 2 value is selected
break;
}
}
如果您不需要任何带首选项的自定义操作,那么您只需要在首选项中添加/删除xml文件,而不应担心首选项的初始化/更新,因为Android框架会为您处理它的