web-dev-qa-db-ja.com

Android設定:ユーザーが設定画面を使用していないときにデフォルト値を読み込む方法

PreferenceActivityを使用して、ユーザーにいくつかの値を設定させています。定義済みの設定を使用してxmlファイルを供給しています。

すべてのAndroid:defaultValue=""を設定しました。

アプリケーションを起動するとき、設定が必要です。または、まだ手動で設定されていない場合は、デフォルト値が必要です。

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean value = prefs.getBoolean("key"), false); 

ただし、Android:defaultValue="true"の場合、falseが引き続き取得されます。したがって、XMLで設定されたdefaultValuesは、設定画面を初期化するとき以外はどこでも使用されていないように見えます。

getBoolean()メソッドのデフォルト値をハードコードしたくありません。だから、これらを1箇所で定義するだけでデフォルト値を取得する方法はありますか?

109
Peterdk

この質問は私の質問に似ています:

initialize-preferences-from-xml-in-main-activity

onCreateメソッドでこのコードを使用するだけです:

PreferenceManager.setDefaultValues(this, R.xml.preference, false);

XMLから設定を読み込み、最後のパラメーター(readAgain)はユーザー設定が上書きされないことを保証します。

さらなる調査のため、Android AP​​Iの PreferenceManager.setDefaultValues をご覧ください。

161
pixel

使用している場合は注意してください
getSharedPreferences(String sharedPreferencesName, int sharedPreferencesMode)

使用する必要がある設定を取得するには
PreferenceManager.setDefaultValues(Context context, String sharedPreferencesName, int sharedPreferencesMode, int resId, boolean readAgain)
デフォルトを設定します!

例えば:
PreferenceManager.setDefaultValues(this, PREFS_NAME, Context.MODE_PRIVATE, R.xml.preference, false);

これが誰かを助けることを願っています。

27

pixelの承認済みの回答:

PreferenceManager.setDefaultValues(this, R.xml.preference, false);

falseはデフォルトが上書きされないことを意味すると述べられています。これは機能ではなく、アプリケーションに複数のエントリポイントがある場合に解析を停止するための単なる効率フラグです。残念ながら、テストは設定ファイルごとに行われないため、複数の設定ファイルがある場合は、最初を除いてすべてtrueをコーディングする必要があります。

効率が心配な場合は、このようなコードを作成できます。

final static private int SPL = 1;
SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
if (sp.getInt("spl", 0) != SPL)
{
    PreferenceManager.setDefaultValues(this, R.xml.prefs1, true);
    PreferenceManager.setDefaultValues(this, R.xml.prefs2, true);
    sp.edit().putInt("spl", SPL).apply();
}

共有設定をさらに追加する場合は、SPLを最大値に設定するだけです。

12
Steve Waring

たとえば、DialogPreferenceを拡張するには、次のようにします。

@Override
protected void onSetInitialValue(boolean restore, Object defaultValue) {
    super.onSetInitialValue(restore, defaultValue);

    if (restore) {
        mValue = shouldPersist() ? getPersistedString(mDefault) : mDefault;
    } else {
        mValue = mDefault;
    }
}

mDefaultは次のいずれかです。

  • mContext.getResources()。getString(attrs.getAttributeResourceValue(androidns、 "defaultValue"、100));
  • rでインデックスを作成したもの.
2
Macarse

また、以前にSharedPreferencesを使用したことがないことを確認してください。それらが変更されていないことを確認するには(つまり、setDefaultValues(this、xml、false)は効果がありません)、アプリをアンインストールしてから再度アップロードして、値が変更されないようにします。これは私を助けました。

0
wirthra