Courty PreferenceクラスでsetDefaultValue()を呼び出しても、デフォルト値は設定されません。なんで?
-
28-10-2019 - |
質問
私は拡張しています PreferenceActivity
私の設定画面用。この好みのアクティビティでは、カスタムメイドの1つがいくつかの好みがあります。問題は次のとおりです。
このカスタム設定では(から拡張されます ListPreference
)デフォルト値を設定できるようにしたいので、 setDefaultValue()
方法。この方法では、いくつかの解析を行うので、正しい値が必要になります。私がこの値を読もうとしているとき getValue()
関数それが返すだけです null
.
だから、私はそこにハードコーディングされた価値を置いたときに何が起こるかを考えました(おそらく、私は何か間違ったことをしたのではなく、初めてではないでしょう)。まあ、私はまだわかります null
戻る。
私が間違っていることはありますか?
編集:
XMLファイルにデフォルトバリューを設定することは、値がそれらを取得するまでわからないため、実際にはオプションではありません。
回避策を講じました:
- アプリが初めて開始されたとき:データを取得します
- 値を設定します。
これにより、データを収集するときにデフォルトの設定を設定します
解決
setDefaultValue
あなたが思うように機能しません。見る 起源 の Preference.java
そして、あなたはそのすべての背後にある論理です。
デフォルトを設定するための好ましい方法は、 android:defaultValue
の属性 preferences.xml
アプリのファイル。
他のヒント
私はついに見つけました ソリューション (StackOverFlow以外のどこか、一度)。
カスタム設定クラスを作成するとき、
- 実装する必要があります
onSetInitialValue
なので xåppli' -i0llwlg'i- 指摘した - 君は また 実装する必要があります
onGetDefaultValue(TypedArray a, int index)
たとえば、カスタム設定がintとして保存されている場合、
@Override
protected void onSetInitialValue(boolean restore, Object defaultValue) {
setValue(restore ? getPersistedInt(FALLBACK_DEFAULT_VALUE) : (Integer) defaultValue);
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
return a.getInteger(index, FALLBACK_DEFAULT_VALUE);
}
今 PreferenceManager.setDefaultValues()
最後に ロードします android:defaultValue
カスタム設定のためにも。まだヌルや虚偽の修正はありませんが、他の場所に投稿された人の回避策があります。
電話したい場合 getValue()
電話後 setDefaultValue()
優先反応性が初めて開いたときにデフォルト値を取得するには、オーバーライドする必要があります onSetInitialValue()
あなたの好みのサブクラスで。それ以外の場合は、電話をかけるときにデフォルト値が設定されません getValue()
そして、それはaを返します null
(あなたが経験したように)。
たとえば、デフォルトの値が整数である場合、あなたの onSetInitialValue()
このように見えるかもしれません:
@Override
protected void onSetInitialValue(boolean restore, Object defaultValue)
{
setValue(restore ? getPersistedInt(DEFAULT_VALUE) : (Integer) defaultValue);
}
DEFAULT_VALUE
永続的なINTを取得できない場合に使用されるように、好みの中で単なる私的定数です。 setValue()
あなたを補完する公開セッターです getValue()
パブリックゲッター、そして次のように見えるはずです:
public int getValue()
{
return mValue;
}
public void setValue(int value)
{
if (value != mValue)
{
mValue = value;
persistInt(value);
}
}
詳細については onSetInitialValue()
, 、APIドキュメントを参照してください ここ.
また、設定クラスのソースコードを確認することもお勧めします(ここ)その理由を理解する onSetInitialValue()
実装する必要があります。特に、見てください setDefaultValue()
, 、そして見てください dispatchSetInitialValue()
.
このような構築中に優先順位を拡張し、デフォルト値を設定できます。
package com.example.package.preference;
public class CustomPreference extends ListPreference{
public CustomPreference(Context context) {
super(context);
init();
}
public CustomPreference(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
Object anyDefaultValueFromCode = ...
setDefaultValue(anyDefaultValueFromCode );
}
}
次に、次のようにXMLから使用できます。
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:key="alarm_prefs_screen"
android:title="@string/set_alarm" >
<com.example.package.preference.CustomPreference
android:key="custom_preference"
android:title="@string/any_title" />
</PreferenceScreen>
これもいつでもうまくいくと思います。
Preference aaa = (Preference) findPreference("xxx");
aaa.setOnPreferenceClickListener(new OnPreferenceClickListener() {
public boolean onPreferenceClick(Preference preference) {
// For edit text preference
((EditTextPreference)preference).getEditText().setText("foobar");
// for list preference
(ListPreference)preference).setValue("foobar");
// etc ...
return true;
}
});
このコードは、ダイアログがデフォルト値を使用してダイアログ内の編集またはリストを起動して入力しようとしているときに検出されます。