编写新的DialogPreference类的简洁方法?

我正在通过扩展DialogPreference类在Android中编写一些自定义首选项对话框。 不过,由于看起来有很多行为需要testing,所以我需要关注一下锅炉板代码的数量。

例如,这个数字首选项对话框的例子是相当典型的: http : //svn.jimblackler.net/jimblackler/trunk/workspace/NewsWidget/src/net/jimblackler/newswidget/NumberPreference.java

特别是, onSave() / RestoreInstanceState()方法和“SavedState类”部分,这些对象的当前更改保留在方向更改上是非常繁琐和复杂的。

有没有人有更简洁的方式编写DialogPreference类的任何提示?

最低限度是:

  1. MyCustomDialogPreference(Context context, AttributeSet attrs)构造函数。
    • 不要忘记调用super(context, attrs)
    • 调用setPersistent(false)向超级首选项类指示您自己保留首选项值。
    • 如果要从资源中setDialogLayoutResource(int dialogLayoutResId)对话框布局,则还要调用setDialogLayoutResource(int dialogLayoutResId)
  2. onBindDialogView(View view) – 使用您的首选项的值更新视图。
    • 不要忘记调用super.onBindDialogView(view)
  3. onDialogClosed(boolean positiveResult) – 如果positiveResult为true,则将视图中的值保存到SharedPreferences中。
    • 不要忘记调用super.onDialogClosed(positiveResult)

这是最低限度的,它假设:

  • 您的自定义DialogPreferencepipe理单个首选项键/值对。
  • 你有责任坚持优先价值。
  • 您正在从资源膨胀对话框面板布局。

现在有一些额外的select:

(a)如果要以编程方式创build对话框布局,则还需要在构造函数中实现onCreateDialogView()而不是调用setDialogLayoutResource()

(b)如果你的首选项只支持一个键/值对,那么你可以使用助手保存方法persistBoolean(boolean), persistFloat(float), persistInt(int), persistLong(long), persistString(String)在onDialogClosed()中更改的优先值。 否则,您需要使用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)方法。


@理查德·牛顿,我知道你问这个问题已经有一个月了。 我希望你仍然可以使用它。