Courty PreferenceクラスでsetDefaultValue()を呼び出しても、デフォルト値は設定されません。なんで?

StackOverflow https://stackoverflow.com/questions/4886469

質問

私は拡張しています PreferenceActivity 私の設定画面用。この好みのアクティビティでは、カスタムメイドの1つがいくつかの好みがあります。問題は次のとおりです。

このカスタム設定では(から拡張されます ListPreference)デフォルト値を設定できるようにしたいので、 setDefaultValue() 方法。この方法では、いくつかの解析を行うので、正しい値が必要になります。私がこの値を読もうとしているとき getValue() 関数それが返すだけです null.

だから、私はそこにハードコーディングされた価値を置いたときに何が起こるかを考えました(おそらく、私は何か間違ったことをしたのではなく、初めてではないでしょう)。まあ、私はまだわかります null 戻る。

私が間違っていることはありますか?

編集:
XMLファイルにデフォルトバリューを設定することは、値がそれらを取得するまでわからないため、実際にはオプションではありません。

回避策を講じました:

  • アプリが初めて開始されたとき:データを取得します
  • 値を設定します。

これにより、データを収集するときにデフォルトの設定を設定します

役に立ちましたか?

解決

setDefaultValue あなたが思うように機能しません。見る 起源Preference.java そして、あなたはそのすべての背後にある論理です。

デフォルトを設定するための好ましい方法は、 android:defaultValue の属性 preferences.xml アプリのファイル。

他のヒント

私はついに見つけました ソリューション (StackOverFlow以外のどこか、一度)。

カスタム設定クラスを作成するとき、

  1. 実装する必要があります onSetInitialValue なので xåppli' -i0llwlg'i- 指摘した
  2. 君は また 実装する必要があります 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;
              }
 });

このコードは、ダイアログがデフォルト値を使用してダイアログ内の編集またはリストを起動して入力しようとしているときに検出されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top