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

Ric*_*ton 38 java mobile android

我正在通过扩展DialogPreference类在Android中编写一些自定义首选项对话框.但是,我对这需要的锅炉板代码量有点担心,因为似乎有很多行为需要测试.

例如,一些偏好对话框的这个例子是相当典型: http://svn.jimblackler.net/jimblackler/trunk/workspace/NewsWidget/src/net/jimblackler/newswidget/NumberPreference.java

特别是,onSave()/ RestoreInstanceState()methods和"类SavedState"部分是必需的,以便在方向更改时保留对话框的当前更改是非常冗长和复杂的.

有没有人有更简洁的方式编写DialogPreference类的技巧?

Roy*_*ron 138

最低限度是:

  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管理单个首选项键/值对.
  • 您有责任保留首选项值.
  • 您正在从资源中膨胀对话框面板布局.

现在有一些额外的选择:

(a)如果要以编程方式创建对话框面板布局,则还要实现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();
    }
}
Run Code Online (Sandbox Code Playgroud)

(c)如果您计划从膨胀的xml提供默认值,那么您还需要实现该onGetDefaultValue(TypedArray a, int index)方法.


@RichardNewton,我知道你问这个问题已经过去了一个月.我希望你仍然可以使用它.

  • 你错过了一件事:如果你需要默认值,你需要实现`onSetInitialValue()`.否则,`setDefaultValue()`和`onGetDefaultValue()`都不会保持默认值! (7认同)