2

PreferenceActivity設定画面を拡張しています。このプリファレンスアクティビティでは、いくつかのプリファレンスがあり、そのうちの1つはカスタムメイドです。問題は次のとおりです。

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

そこで、ハードコードされた値をそこに入れるとどうなるかを考えました(おそらく、何か間違ったことをしたのは初めてではないでしょう)。まあ、私はまだnull戻ってきます。

私が間違っていることについて何か考えはありますか?

編集:
値は取得するまでわからないため、xmlファイルでdefaultValueを設定することは実際にはオプションではありません。

私は回避策を作成しました:

  • アプリを初めて起動するとき:データを取得する
  • プリファレンスで値を設定します。

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

4

7 に答える 7

5

私はついに解決策を見つけました(StackOverflow以外の場所で一度だけ)。

カスタムPreferenceクラスを作成する場合、

  1. XåpplI'-I0llwlg'I-が指摘したonSetInitialValueように実装する必要があります
  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に、カスタム設定のもロードします。nullとfalseの修正はまだありませんが、他の場所に投稿されたものには回避策があります。

于 2014-08-31T01:43:29.300 に答える
2

呼び出しgetValue()後に呼び出しsetDefaultValue()てPreferenceActivityを初めて開いたときにデフォルト値を取得する場合onSetInitialValue()は、Preferenceサブクラスでオーバーライドする必要があります。それ以外の場合、呼び出し時にデフォルト値は設定されず、(経験しgetValue()たように)が返さnullれます。

たとえば、デフォルト値が整数の場合、次のonSetInitialValue()ようになります。

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

DEFAULT_VALUEは、永続化されたintを取得できない場合に使用される、Preference内の単なるプライベート定数です。setValue()はパブリックゲッターを補完するパブリックセッターであり、次のgetValue()ようになります。

public int getValue()
{
    return mValue;
}

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

の詳細については、こちらonSetInitialValue()のAPIドキュメントを参照してください。

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

于 2013-01-04T17:19:59.893 に答える
1

setDefaultValueあなたが思っているようには機能しません。のソースを見ると、Preference.javaそのすべての背後にあるロジックがわかります。

デフォルトを設定するための推奨される方法は、アプリandroid:defaultValueのファイルで属性を指定することです。preferences.xml

于 2011-02-03T13:30:39.787 に答える
1

.xml設定をコードに変換しました。すべてsetDefaultValueがそこでうまく機能します。

val screen = preferenceManager.createPreferenceScreen(context)

val editText = EditTextPreference(context).apply {
         setIcon(R.drawable.lobat_cloud)
         key = "key"
         title = "MyPreferences"
         ...

         setDefaultValue("My Default Value")
      }

screen.addPreference(editText)

// add other preferences

preferenceScreen = screen

より詳しい情報

PS:この方法は、すべての設定やその他の回答をカスタマイズするよりも小さく、明確であることがわかりました。

于 2021-05-29T17:30:44.703 に答える
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>
于 2013-06-13T09:33:17.580 に答える
0

これは私が私のためにしたことと働いたことです:

class DefaultValueEditTextPreference : androidx.preference.EditTextPreference {
    @Suppress("unused")
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int, defStyleRes: Int) : super(context, attrs, defStyleAttr, defStyleRes)
    @Suppress("unused")
    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
    @Suppress("unused")
    constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
    @Suppress("unused")
    constructor(context: Context?) : super(context)

    init {
        text = ... //the default, dynamic text that you want to have
    }

}
于 2020-12-16T11:26:11.567 に答える
-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;
              }
 });

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

于 2011-12-17T19:32:41.153 に答える