PreferenceActivityを使用して、ユーザーにいくつかの値を設定させています。定義済みの設定を使用してxmlファイルを供給しています。
すべてのAndroid:defaultValue=""
を設定しました。
アプリケーションを起動するとき、設定が必要です。または、まだ手動で設定されていない場合は、デフォルト値が必要です。
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean value = prefs.getBoolean("key"), false);
ただし、Android:defaultValue="true"
の場合、false
が引き続き取得されます。したがって、XMLで設定されたdefaultValuesは、設定画面を初期化するとき以外はどこでも使用されていないように見えます。
getBoolean()
メソッドのデフォルト値をハードコードしたくありません。だから、これらを1箇所で定義するだけでデフォルト値を取得する方法はありますか?
この質問は私の質問に似ています:
initialize-preferences-from-xml-in-main-activity
onCreate
メソッドでこのコードを使用するだけです:
PreferenceManager.setDefaultValues(this, R.xml.preference, false);
XMLから設定を読み込み、最後のパラメーター(readAgain
)はユーザー設定が上書きされないことを保証します。
さらなる調査のため、Android APIの PreferenceManager.setDefaultValues をご覧ください。
使用している場合は注意してください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);
これが誰かを助けることを願っています。
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を最大値に設定するだけです。
たとえば、DialogPreference
を拡張するには、次のようにします。
@Override
protected void onSetInitialValue(boolean restore, Object defaultValue) {
super.onSetInitialValue(restore, defaultValue);
if (restore) {
mValue = shouldPersist() ? getPersistedString(mDefault) : mDefault;
} else {
mValue = mDefault;
}
}
mDefaultは次のいずれかです。
また、以前にSharedPreferencesを使用したことがないことを確認してください。それらが変更されていないことを確認するには(つまり、setDefaultValues(this、xml、false)は効果がありません)、アプリをアンインストールしてから再度アップロードして、値が変更されないようにします。これは私を助けました。