PreferenceFragment和体系结构的用法

时间:2017-02-17 22:01:33

标签: java android

在我的应用程序中,我有偏好:“pref1”,可能的值为0,1,2。我在SharedPreferences类的帮助下持有它们。

  1. 我想提供一个用户界面来改变它。我使用SettingFragment extends PreferenceFragment root创建了类PreferenceScreen和xml文件。在xml文件中,我必须设置android:key字段来绑定UI和SharedPreferences

  2. 要在用户更改“pref1”后更改我的应用行为,我必须实施OnSharedPreferenceChangeListener

  3. 同样在程序开始时我需要获得“pref1”的值, 根据保存的偏好同步程序状态。

  4. 因此,当我想要添加/删除/修改我的应用程序设置单位时,我应该更改3个地方。看起来很糟糕另一种选择是编写一个class,其成员变量为SharedPreferences类型,并隐藏所有SharedPreferences键,并提供简单的set / get方法来获取首选项。但在这种情况下,我必须使用Android UI的普通工具:布局。

    所以,如果没有将关于首选项存储的内部结构(键的名称,默认值,它们的类型)的知识传播到几个地方,就可以使用PreferenceFragment, 或者更好地使用普通布局?

2 个答案:

答案 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框架会为您处理它