我正在通过扩展DialogPreference
类在Android中编写一些自定义首选项对话框。但是,我对这需要的锅炉板代码量有点担心,因为似乎有很多行为需要测试。
例如,数字首选项对话框的这个示例非常典型: http://svn.jimblackler.net/jimblackler/trunk/workspace/NewsWidget/src/net/jimblackler/newswidget/NumberPreference.java
特别是,onSave()
/ RestoreInstanceState()
方法和“类SavedState”部分是必需的,以便在方向更改时保留对话框的当前更改,这是非常冗长和复杂的。
有没有人有更简洁的方式编写DialogPreference类的提示?
答案 0 :(得分:136)
MyCustomDialogPreference(Context context, AttributeSet attrs)
构造函数。
super(context, attrs)
。setPersistent(false)
向超级Preference类指示您自行保留偏好值。setDialogLayoutResource(int dialogLayoutResId)
。onBindDialogView(View view)
- 使用您偏好的值更新视图。
super.onBindDialogView(view)
。onDialogClosed(boolean positiveResult)
- 如果positiveResult为true,则将视图中的值保存到SharedPreferences。
super.onDialogClosed(positiveResult)
。这是最低限度,它假定:
(a)如果要以编程方式创建对话框面板布局,请同时实施 onCreateDialogView()
,而不是在构造函数中调用setDialogLayoutResource()
。
(b)如果您的首选项仅支持单个键/值对,则可以在onDialogClosed()中保留更改的首选项值时使用帮助程序保存方法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)
方法。