Android設定:ユーザーが設定画面を使用していないときにデフォルト値をロードするにはどうすればよいですか?


119

ユーザーがいくつかの値を設定できるように、PreferenceActivityを使用しています。定義済みの設定を含むxmlファイルをフィードしています。

私はandroid:defaultValue=""彼らのためにすべてを設定しました。

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

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

しかし、android:defaultValue="true"私はまだ得るときfalse。そのため、XMLで設定されたdefaultValuesは、設定画面を初期化するとき以外はどこにも使用されないようです。

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

回答:


169

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

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

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

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

XMLから設定をロードし、最後のパラメーター(readAgain)はユーザー設定が上書きされないことを保証します。つまり、readAgain引数をに設定するとfalse、このメソッドが過去に呼び出されたことがない場合にのみデフォルト値が設定されるため、アクティビティが作成されるたびにユーザーの設定をオーバーライドする必要はありません。

見てくださいPreferenceManager.setDefaultValuesさらなる調査のためのAndroidのAPIでを。


これを、作成した別のSharedPrefrence変数に使用できますか?
Amol Gupta

8
あなたのアプリケーションは複数のエントリポイントを持っている場合にも、それを置くonCreate()Application
SD

2
ブール値を使用し、デフォルトが「false」の場合、これは機能しません。Android2.xではデフォルトのエントリが作成されないためです。「.getBoolean(KEY、true)」の呼び出しは常にtrueを返します。Android 4.xでは動作します。
Gunnar Bernstein、

10
readAgaintrueに設定しても、ユーザー設定が上書きされることとは関係ありません。Javadocから:注:これによって設定がデフォルト値にリセットされることはありません。
devconsole 2014年

1
このソリューションに問題がある(動作しない、または部分的または常に動作しない)場合は、以下のSteve Waringの回答を参照してください(stackoverflow.com/a/25602205/4410376)。おそらく、いくつかの共有設定ファイルがあります。つまり、Androidは、設定または乱雑なコードに基づいて、いくつかの共有設定ファイルを作成しています。
Hack06

27

使用している場合は、
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);

これが誰かの役に立つことを願っています。


13

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を最大数に設定してください。


2
別の方法として、デフォルト値の設定にのみ使用するバルクのpreferences.xmlを常に作成できます。たとえば、あなたが持っているならば R.xml.prefs_deviceR.xml.prefs_testR.xml.prefs_admin。上記のすべての設定を含む1つの設定ファイルを作成できます R.xml.prefs_for_loading_default_values。次に、それを使用します PreferenceManager.setDefaultValues(this, R.xml.prefs_for_loading_default_values, false);
Chantell Osejo 2015年

効率性について:これonCreate()Application(マニフェストに登録されている)のサブクラスで呼び出すと、アプリケーションの起動ごとに1回だけ呼び出されます。パフォーマンスに関しては、(もしあれば)アプリが起動するたびに(最初の起動時にのみ)構文解析を行わないほうが適切であり、これがfalse機能します。したがって、各開始時にチェックが必要かどうか(たとえば、新しい設定が追加される可能性がある場合)か、または最初の開始(または設定のリセット)で完了した場合は十分かどうかの問題です。
user905686 '10 / 06/18

2

たとえば、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で索引付けしたもの。

わかりました、あなたが達成しようとしていることについて、私はここで少し迷っています。DialogPreferenceを呼び出したくありません。ユーザーがPreferencesを使用しない場合は、デフォルト値が必要です。
Peterdk 2010

prefs.xmlでデフォルトの設定を使用する代わりに、独自のクラスを作成できます。たとえば、DialogPreferenceから拡張した新しいDialogPreferenceを作成して、onSetInitialValueをオーバーライドできます。
Macarse 2010

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.