1

設定画面でPreferenceActivityを延長しています。この嗜好活動では、私はそのうちの1つがカスタムメイドである2つの嗜好を持っています。問題は次のとおりです。カスタムPreferenceクラスでsetDefaultValue()を呼び出しても、デフォルト値は設定されません。どうして?

ListPreferenceから拡張)このカスタム設定では、デフォルト値を設定できるようにしたいので、setDefaultValue()メソッドをオーバーライドします。このメソッドでは、正しい値をとるように解析を行います。 getValue()関数でこの値を読み取ろうとすると、nullが返されます。

私は、ハードコーディングされた値をそこに入れたときに何が起こるかを考えました(あなたが知っている、多分私は間違ったことをしました、初めてではないでしょう)。さて、私はまだnullを返します。

私が間違っていることは何ですか?

編集:私はそれらを取得するまでの値が知られていないので、
xmlファイルにはdefaultValueを設定するには、実際にはオプションではありません。

私は回避策を作っ:

  • アプリを初めて起動すると:データ
  • は優先して値を設定します。

私はコレクションのデータが

+0

getValue()を呼び出す前にsetDefaultValue()を呼び出していますか?環境設定ビューを作成する前に読み込まれたpreferences.xmlファイルにデフォルトの環境設定を設定しました。どのようにデフォルト値を設定しますか? –

+0

はい、私はそうですが、コード内です。問題は、アプリケーションが最初に起動されるまで私はデフォルト値を知らないということです。だから私はそれがユーザーがpreferenceactivityを開く初めて設定しようとする – Nick

答えて

1

setDefaultValueあなたはそれがないと思うように動作しませんよときに私は、デフォルトの優先度を設定し、この方法では。 the sourcePreference.javaのように見てみると、その背後には論理があります。

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

+0

まあ私は本当にエントリが静的ではないので、私はできません。私が見る唯一の(汚れた)回避策は、デフォルト値を設定してsetValue()を使うときに設定した優先度のフラグを設定するだけです。 – Nick

+0

@Dave Linkが死んでいます。 –

-1

これはいつでもうまくいくと思います。

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; 
       } 
}); 

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

+0

これは動作しません。設定値は設定されていますが、少なくとも 'ListPreference'の場合、リストは設定されていません。 – FabiF

2

setDefaultValue()を呼び出して初めてPreferenceActivityを開くときにデフォルト値を取得した後にgetValue()に電話する場合は、PreferenceサブクラスでonSetInitialValue()を無効にする必要があります。それ以外の場合、getValue()に電話するとデフォルト値は設定されず、null(経験値通り)が返されます。例えば

デフォルトの値が整数であれば、あなたのonSetInitialValue()は次のようになります。

@Override 
protected void onSetInitialValue(boolean restore, Object defaultValue) 
{ 
    setValue(restore ? getPersistedInt(DEFAULT_VALUE) : (Integer) defaultValue); 
} 

DEFAULT_VALUEは持続intは取得できない場合に使用する優先内部だけのプライベートな定数です。setValue()はあなたのgetValue()公共ゲッターを補完する公共のセッターであり、このようなものになります。APIのドキュメントを参照してくださいhereonSetInitialValue()の詳細については

public int getValue() 
{ 
    return mValue; 
} 

public void setValue(int value) 
{ 
    if (value != mValue) 
    { 
     mValue = value; 
     persistInt(value); 
    } 
} 

を。

なぜonSetInitialValue()を実装する必要があるのか​​を理解するには、Preferenceクラス(here)のソースコードを参照することをお勧めします。特に、setDefaultValue()を見てから、dispatchSetInitialValue()を見てください。

0

あなたは好みを拡張し、このように構築時にデフォルト値を設定することができます。

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> 
2

私は最終的にStackOverflowのほかthe solution(どこかを見つけました、一度)。

あなたもあなた

  • を指摘XåpplI'-I0llwlg'I -として例えばonGetDefaultValue(TypedArray a, int index)
  • を実装する必要性を、カスタム場合は、onSetInitialValueを実装する必要があり、

    1. をカスタムの優先クラスを作成します設定は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を読み込みます。 nullsとfalseの修正はまだありませんが、他の場所に投稿されたものの回避策があります。

    関連する問題