web-dev-qa-db-ja.com

新しいDialogPreferenceクラスを記述する簡潔な方法は?

Android DialogPreferenceクラスを拡張することでいくつかのカスタム設定ダイアログを書いています。しかし、必要なボイラープレートコードの量に少し心配になっています。これは、テストする動作がたくさんあるようです。

たとえば、この番号設定ダイアログの例はかなり典型的です: http://svn.jimblackler.net/jimblackler/trunk/workspace/NewsWidget/src/net/jimblackler/newswidget/NumberPreference.Java

特に、onSave()/RestoreInstanceState()メソッドおよび「クラスSavedState」パーツは、方向の変更時にダイアログへの現在の変更が保持されるために必要であり、非常に冗長で複雑です。

より簡潔な方法でDialogPreferenceクラスを作成するためのヒントはありますか?

38
RichardNewton

最低限必要なものは次のとおりです。

  1. MyCustomDialogPreference(Context context, AttributeSet attrs)コンストラクター。
    • super(context, attrs)を呼び出すことを忘れないでください。
    • setPersistent(false)を呼び出して、自分自身で設定値を永続化することをスーパーPreferenceクラスに示します。
    • リソースからダイアログパネルのレイアウトを拡張する場合は、setDialogLayoutResource(int dialogLayoutResId)も呼び出します。
  2. onBindDialogView(View view)-好みの値でビューを更新します。
    • super.onBindDialogView(view)を呼び出すことを忘れないでください。
  3. onDialogClosed(boolean positiveResult)-positiveResultがtrueの場合、ビューの値をSharedPreferencesに永続化します。
    • super.onDialogClosed(positiveResult)を呼び出すことを忘れないでください。

これは最低限であり、以下を前提としています。

  • カスタムDialogPreferenceは、1つの設定キーと値のペアを管理します。
  • あなたは設定値を永続化する責任があります。
  • リソースからダイアログパネルレイアウトを拡張しています。

次に、いくつかの追加オプションについて:

(a)ダイアログパネルレイアウトをプログラムで作成する場合は、コンストラクターでonCreateDialogView()を呼び出す代わりに、setDialogLayoutResource()も実装します。

(b)設定が単一のキー/値ペアのみをサポートする場合、onDialogClosed()で変更された設定値を永続化するときに、ヘルパーのsaveメソッドpersistBoolean(boolean), persistFloat(float), persistInt(int), persistLong(long), persistString(String)を使用できます。それ以外の場合は、次のようにgetEditor()メソッドを使用する必要があります。

_private MyCustomView myView;

@Override
protected void onBindDialogView(View view) {
    super.onBindDialogView(view);

    // the view was created by my custom onCreateDialogView()
    myView = (MyCustomView)view;

    SharedPreferences sharedPreferences = getSharedPreferences();
    myView.setValue1(sharedPreferences.getString(myKey1, myDefaultValue1));
    myView.setValue2(sharedPreferences.getString(myKey2, myDefaultValue2));
}

@Override
protected void onDialogClosed(boolean positiveResult) {
    super.onDialogClosed(positiveResult);

    if (positiveResult) {
        Editor editor = getEditor();
        editor.putString(myKey1, myView.getValue1());
        editor.putString(myKey2, myView.getValue2());
        editor.commit();
    }
}
_

(c)インフレートされたxmlからデフォルト値を提供する場合は、onGetDefaultValue(TypedArray a, int index)メソッドも実装する必要があります。


@RichardNewton、あなたが質問してから1か月が経過したことを知っています。引き続きご利用いただければ幸いです。

138
Roy Sharon