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

2022-09-01 03:25:12

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

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

特别是,/方法和“类 SavedState”部分,这些部分需要它们在方向更改时保留对对话框的当前更改,这是非常详细和复杂的。onSave()RestoreInstanceState()

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


答案 1

最低限度是:

  1. MyCustomDialogPreference(Context context, AttributeSet attrs) constructor.
    • 别忘了打电话给.super(context, attrs)
    • 调用以指示超级首选项类自行保留首选项值。setPersistent(false)
    • 如果要从资源中扩充对话框面板布局,则还要调用 。setDialogLayoutResource(int dialogLayoutResId)
  2. onBindDialogView(View view) - 使用您喜欢的值更新视图。
    • 别忘了打电话给.super.onBindDialogView(view)
  3. onDialogClosed(布尔正值结果) - 如果正结果为真,则将值从您的视图保存到共享首选项。
    • 别忘了打电话给.super.onDialogClosed(positiveResult)

这是最低限度,它假设:

  • 您的自定义 DialogPreference 管理单个首选项键/值对。
  • 您负责保留首选项值。
  • 您正在从资源膨胀对话框面板布局。

现在了解一些其他选项:

(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,我知道自从你问这个问题以来已经过去了一个月。我希望你仍然可以使用它。


答案 2

推荐