有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java对PreferenceFragment和体系结构的使用

在我的应用程序中,我有一个首选项:“pref1”,可能值为0、1、2。我在SharedPreferences班的帮助下拿着它们

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

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

  3. 在程序开始时,我还需要得到“pref1”的值, 根据保存的首选项同步程序状态

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

任何使用PreferenceFragment而不将偏好存储的内部结构(键的名称、默认值及其类型)的知识传播到多个地方的方法也是如此, 还是使用普通布局更好


共 (1) 个答案

  1. # 1 楼答案

    对于PreferenceFragment中的首选项,不需要有单独的共享首选项键。如果您已将其指定为persistent(Android:persistent=true),Android framework会自动将其保存在共享首选项中。默认情况下,persistent标志为true。 根据文件:

    PreferenceFragment shows a hierarchy of Preference objects as lists. These preferences will automatically save to SharedPreferences as the user interacts with them.

    对于您的情况,您可以使用列表首选项

        <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(“Prefer1”)

        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 framework将为您处理它