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

Java 编写新DialogPreference类的简明方法?,java,android,mobile,Java,Android,Mobile,我通过扩展DialogPreference类在Android中编写了一些自定义的首选项对话框。然而,我有点担心这需要多少锅炉板代码,因为似乎有很多行为需要测试 例如,数字首选项对话框的示例相当典型: 特别是,onSave/RestoreInstanceState方法和类SavedState部分非常冗长和复杂,它们是在方向更改时保留对话框当前更改所必需的 有没有人有更简洁地编写DialogPreference类的技巧?最基本的技巧是: MyCustomDialogPreferenceContex

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

例如,数字首选项对话框的示例相当典型:

特别是,onSave/RestoreInstanceState方法和类SavedState部分非常冗长和复杂,它们是在方向更改时保留对话框当前更改所必需的

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

最基本的技巧是: MyCustomDialogPreferenceContext上下文,AttributeSet属性构造函数。 别忘了调用超级上下文,attrs。 调用setPersistentfalse向超级首选项类指示您自己持久化首选项值。 如果要从资源中展开对话框面板布局,请同时调用SetDialogLayoutResource dialogLayoutResId。 onBindDialogViewView-使用首选项的值更新视图。 别忘了调用super.onBindDialogViewview。 onDialogClosedboolean positiveResult-如果positiveResult为true,则将视图中的值持久化到SharedReferences。 别忘了调用super.ondialogclosedppositiveresult。 这是最低限度,假设:

您的自定义DialogPreference管理单个首选项键/值对。 您负责保留首选项值。 您正在从资源中扩展对话框面板布局。 现在了解一些其他选项: a如果希望以编程方式创建对话框面板布局,则还应实现onCreateDialogView,而不是在构造函数中调用setDialogLayoutResource

b如果您的首选项仅支持单个键/值对,则在onDialogClosed中持久化更改的首选项值时,可以使用帮助器保存方法persistBooleanboolean、persistFloatfloat、PersistIntent、persistLonglong、persistStringString。否则,您需要使用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中提供默认值,那么还需要实现onGetDefaultValueTypedArray a,int index方法


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

哦,关于onSave/RestoreInstanceState方法:如果您的自定义对话框面板没有任何状态可持久化,并且您正在自行处理首选项值的持久化,那么就不需要重写onSave/RestoreInstanceState方法了。persistBoolean和其他类似的方法会使用提供给android:key的键来存储该方法吗?如果没有提供密钥怎么办?是的,它将使用提供的安卓:密钥保持。如果未提供任何键,它将抛出IllegalStateExceptionPreference。没有指定键。您遗漏了一件事:如果需要默认值,则需要实现onSetInitialValue。否则,setDefaultValue和onGetDefaultValue都不会保留默认值!好帖子,谢谢!不过有一个问题,您展示了如何使用persist*方法持久化值,但是反过来呢?换句话说,如何获取首选项的值?例如,在初始化期间,以便可以预先填充对话框中的任何字段?我看到有getSharedReferences.getString,但它接受一个键,因此意味着我们知道首选项键是什么,但情况可能并非如此——例如,如果首选项是从XML preferences.XML添加的。