1

私は、preferences.xml で指定したデフォルト値を復元するのに苦労しています。私のコードは次のとおりです。

    Preference reset = findPreference(res.getString(R.string.DEFAULT_PREFS));
    reset.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {

        public boolean onPreferenceClick(Preference p) {
            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(Preferences.this);
            sp.edit().clear().commit();
            PreferenceManager.setDefaultValues(Preferences.this, R.layout.preferences, true);
            return true;
        }
    });

このコードは、関数setDefaultValues(context, resId, readAgain)に対する Android 開発者リファレンスの私の理解です。

パラメーター

context 共有設定のコンテキスト。
resId プリファレンス階層 XML ファイルのリソース ID。
readAgain デフォルト値を再読み込みするかどうか。

注: これにより、設定がデフォルト値にリセットされることはありません。その機能については、getDefaultSharedPreferences(Context) を使用してクリアし、続いてこのパラメーターを true に設定してこのメ​​ソッドを呼び出します

まあ、それは機能しません。このコードが実行された後、設定値は同じです。次に、SharedPreferences 変数 sp を調べたところ、次のパスにあるシステム生成ファイルを指してい
ます
。アクティビティを作成しました。

    addPreferencesFromResource(R.layout.preferences);

また、sp 変数を調べると、ハッシュ テーブルにはすべての設定がありますが、デフォルト値のフィールドはありません。

編集: 質問される前に、preferences.xml ファイルからの抜粋を次に示します。

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

<EditTextPreference
    android:defaultValue="5000"
    android:key="@string/MAX_MESSAGES"
    android:numeric="integer"
    android:summary="@string/MAX_MESSAGES_desc"
    android:title="@string/MAX_MESSAGES_title" />

<EditTextPreference
    android:defaultValue="10"
    android:key="@string/VIEW_EDGE_ROWS"
    android:numeric="integer"
    android:summary="@string/VIEW_EDGE_ROWS_desc"
    android:title="@string/VIEW_EDGE_ROWS_title" />

<ListPreference
    android:defaultValue="0"
    android:entries="@array/level_list"
    android:entryValues="@array/level_values"
    android:key="@string/INITIAL_ORG"
    android:summary="@string/INITIAL_ORG_desc"
    android:title="@string/INITIAL_ORG_title" />

<ListPreference
    android:defaultValue="2"
    android:entries="@array/view_list"
    android:entryValues="@array/view_values"
    android:key="@string/INITIAL_VIEW"
    android:summary="@string/INITIAL_VIEW_desc"
    android:title="@string/INITIAL_VIEW_title" />

<CheckBoxPreference
    android:defaultValue="true"
    android:key="@string/AUTOSCROLL"
    android:summary="@string/AUTOSCROLL_desc"
    android:title="@string/AUTOSCROLL_title" />

<CheckBoxPreference
    android:defaultValue="true"
    android:key="@string/SEND_THEN_EXIT"
    android:summary="@string/SEND_THEN_EXIT_desc"
    android:title="@string/SEND_THEN_EXIT_title" />

<Preference
    android:key="@string/DEFAULT_PREFS"
    android:summary="@string/DEFAULT_PREFS_desc"
    android:title="@string/DEFAULT_PREFS_title" />

</PreferenceScreen>
4

1 に答える 1

0

これがこれまでの私の解決策です。setDefaultValues()Android ソース コードにデバッグした後、信頼性が低く、意図したとおりに動作しないことがわかりました(少なくとも私の期待によると)。
現在、デフォルト値を手動で復元しています。デフォルト値から取得できるマップがあります。

ここに興味深いメモがあります: Preference クラスを調べると、設定mDefaultValueのデフォルト値を含むというフィールドがあることがわかります。ただし、このフィールドはメソッドでしか設定できず、取得するsetDefaultValue()メソッドはありません。マップの必要性を省いてくれたでしょう

これは私が現在使用しているコードで、テスト済みで動作しています。

    Preference reset = findPreference(getResources().getString(R.string.DEFAULT_PREFS));
    reset.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {

        public boolean onPreferenceClick(Preference p) {
            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(Preferences.this);
            SharedPreferences.Editor editor = sp.edit();
            editor.clear();
            // PreferenceManager.setDefaultValues(Preferences.this, R.layout.preferences, false);
            for(int i = 0; i < getPreferenceScreen().getPreferenceCount(); i++) {
                restoreDefault(editor, getPreferenceScreen().getPreference(i));
            }
            editor.commit();
            return true;
        }
    }
private void restoreDefault(Editor editor, Preference p) {
    if(p instanceof PreferenceCategory) {
        PreferenceCategory pCat = (PreferenceCategory) p;
        for(int i = 0; i < pCat.getPreferenceCount(); i++) {
            restoreDefault(editor, pCat.getPreference(i));
        }
    }
    if(p instanceof ListPreference) {
        editor.putString(p.getKey(), resMap.get(p.getKey())._default);
    }
    if(p instanceof EditTextPreference) {
        editor.putString(p.getKey(), resMap.get(p.getKey())._default);
    }
    if(p instanceof CheckBoxPreference) {
        editor.putBoolean(p.getKey(), resMap.get(p.getKey())._default.equals("true"));
    }
}

別の注意:editor.commit()設定ファイルを更新しますが、設定画面は更新しません。リスナー ( ) を使用して、各設定を更新する必要がありますOnSharedPreferenceChangeListener()

于 2012-05-17T05:23:03.277 に答える