PreferenceFragment不保存值 - 使用测试用例和屏幕截图

问题描述 投票:1回答:1

我为我的问题准备了a simple test case at GitHub并且有一种感觉,只有几行代码缺失才能使它工作。

在Android应用程序中,我有1个活动(MainActivity.java)和2个片段(MainFragment.javaPrefFragment.java) - 当我更改首选项片段中的值时,它们不会被保存。

此外,未加载默认值且未更新摘要:

这是我的PrefFragment,我注册了一个共享的prefs监听器 - 为了更新摘要 - 但由于某种原因它永远不会被调用:

public class PrefFragment extends PreferenceFragment 
    implements OnSharedPreferenceChangeListener {

    public static final String BOOL_1 = "bool_1";
    public static final String STR_1 = "str_1";
    public static final String STR_2 = "str_2";

    private CheckBoxPreference mBool1;
    private EditTextPreference mStr1;
    private EditTextPreference mStr2;
    private SharedPreferences mPrefs;   
    private Editor mEditor;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(false);
        addPreferencesFromResource(R.xml.preferences);
        mBool1 = (CheckBoxPreference) findPreference(BOOL_1);
        mStr1 = (EditTextPreference) findPreference(STR_1);
        mStr2 = (EditTextPreference) findPreference(STR_2);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        mPrefs = PreferenceManager.getDefaultSharedPreferences(activity);
        mEditor = mPrefs.edit();
        mPrefs.registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mPrefs.unregisterOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences prefs, 
                                          String key) {
        Log.d("onSharedPreferenceChanged", key); // XXX is never called

        if (BOOL_1.equals(key)) {
            boolean bool1 = prefs.getBoolean(key, false);
            mBool1.setSummary(bool1 ? "Enabled" : "Disabled");
        } else if (STR_1.equals(key)) {
            String str1 = prefs.getString(key, "");
            mStr1.setSummary(str1);
        } else if (STR_2.equals(key)) {
            String str2 = prefs.getString(key, "");
            mStr2.setSummary(str2);
        }       
    }    
}

这是preference.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <PreferenceCategory 
        android:title="Category 1"
        android:key="category_1">

        <CheckBoxPreference
            android:key="bool_1"
            android:title="Boolean 1"
            android:summary="XXX how to set this? XXX"
            android:defaultValue="false" />
        <EditTextPreference 
            android:dependency="bool_1"
            android:key="str_1"
            android:title="String 1"
            android:summary="XXX how to set this? XXX"
            android:defaultValue="change me" />
        <EditTextPreference 
            android:dependency="bool_1"
            android:key="str_2"
            android:title="String 2"
            android:summary="XXX how to set this? XXX"
            android:defaultValue="change me too" />
        </PreferenceCategory>

</PreferenceScreen>

所以我的问题是如何在PreferenceFragment中处理(加载,保存)值?我真的需要扩展EditTextPreference并在我的自定义类中实现onDialogClosed方法吗?这对我来说似乎是一种矫枉过正的做法。

android android-fragments sharedpreferences android-preferences android-settings
1个回答
0
投票

好吧,以下似乎适用于PrefFragment.java

@Override
public void onResume() {
    super.onResume();

    SharedPreferences prefs = getPreferenceManager().getSharedPreferences();

    // CHANGE 1: load saved values to set the summaries
    onSharedPreferenceChanged(prefs, BOOL_1);
    onSharedPreferenceChanged(prefs, STR_1);
    onSharedPreferenceChanged(prefs, STR_2);

    // CHANGE 2: register shared prefs listener in onResume
    prefs.registerOnSharedPreferenceChangeListener(this);
}

@Override
public void onPause() {
    super.onPause();
    SharedPreferences prefs = getPreferenceManager().getSharedPreferences();
    prefs.unregisterOnSharedPreferenceChangeListener(this);
}
© www.soinside.com 2019 - 2024. All rights reserved.