1

在 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方法吗?这对我来说似乎是一种矫枉过正的方法。

4

1 回答 1

1

好的,以下似乎适用于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);
}
于 2015-05-01T14:15:53.657 回答