我正在通过扩展在 Android 中编写一些自定义首选项对话框DialogPreference
班级。但是,我有点担心所需的样板代码量,因为似乎有很多行为需要测试。
例如,这个数字首选项对话框的示例相当典型:http://svn.jimblackler.net/jimblackler/trunk/workspace/NewsWidget/src/net/jimblackler/newswidget/NumberPreference.java
特别是,onSave()
/RestoreInstanceState()
方法和“类 SavedState”部分非常冗长和复杂,以便在方向更改时保留对话框的当前更改。
有没有人有任何以更简洁的方式编写 DialogPreference 类的技巧?
最低限度是:
-
MyCustomDialogPreference(Context context, AttributeSet attrs)
constructor.
- 别忘了打电话
super(context, attrs)
.
- Call
setPersistent(false)
向超级 Preference 类表明您自己保留首选项值。
- 如果您想从资源中扩充对话框面板布局,那么还可以调用
setDialogLayoutResource(int dialogLayoutResId)
.
-
onBindDialogView(View view)
- update the view with the value(s) of your preference.
- 别忘了打电话
super.onBindDialogView(view)
.
-
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(使用前将#替换为@)