编写新 DialogPreference 类的简洁方法?

2023-11-22

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

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

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

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


最低限度是:

  1. MyCustomDialogPreference(Context context, AttributeSet attrs) constructor.
    • 别忘了打电话super(context, attrs).
    • Call setPersistent(false)向超级 Preference 类表明您自己保留首选项值。
    • 如果您想从资源中扩充对话框面板布局,那么还可以调用setDialogLayoutResource(int dialogLayoutResId).
  2. onBindDialogView(View view) - update the view with the value(s) of your preference.
    • 别忘了打电话super.onBindDialogView(view).
  3. onDialogClosed(boolean positiveResult) - if positiveResult is true then persist the value(s) from your view to the 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();
    }
}

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


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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编写新 DialogPreference 类的简洁方法? 的相关文章

随机推荐