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

时间:2010-12-22 03:09:59

标签: java android mobile

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

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

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

有没有人有更简洁的方式编写DialogPreference类的提示?

1 个答案:

答案 0 :(得分:136)

最低限度是:

  1. MyCustomDialogPreference(Context context, AttributeSet attrs) 构造函数。
    • 不要忘记致电super(context, attrs)
    • 调用setPersistent(false)向超级Preference类指示您自行保留偏好值。
    • 如果要从资源中扩充对话框面板布局,请同时调用setDialogLayoutResource(int dialogLayoutResId)
  2. onBindDialogView(View view) - 使用您偏好的值更新视图。
    • 不要忘记致电super.onBindDialogView(view)
  3. onDialogClosed(boolean positiveResult) - 如果positiveResult为true,则将视图中的值保存到SharedPreferences。
    • 不要忘记致电super.onDialogClosed(positiveResult)
  4. 这是最低限度,它假定:

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

    现在有一些额外的选择:

    (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)方法。


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