设置TimePickerPreference的默认值

时间:2011-05-14 09:28:55

标签: android android-preferences

我正在使用此TimePickerPreference实现:http://www.ebessette.com/d/TimePickerPreference

效果很好。但我不知道如何为它设置默认值。因此,如果首次调用首选项,则应显示当前时间。 我还想扩展它,以显示标题中选择的时间。

在我的preference.xml中:               

       <com.example.preference.TimePickerPreference
            android:key="quit_time"
            android:dialogTitle="Quit"
            android:title="Quit"/>

2 个答案:

答案 0 :(得分:1)

也许此代码可以帮助您TimePickerPreference.java

答案 1 :(得分:0)

首先,我为我的英语道歉,我正在拉译员。我知道线程已经老了,但我今天搜索了这个问题的信息,而且nadia没有解决。如果发生在我身边的其他任何人,我会离开。这个组件还有一个错误,如果你取消插入的时间,这总是存储。同时评论您的解决方案。

让我们从主要事情开始,并不正是为什么他从不抛出默认值的设定者,最快的解决方案是手动控制元素构建器。我个人决定创建一个名为“timeByDefault”的新属性,该属性负责执行“defaultValue”的功能。


    /**
     * @param context
     * @param attrs
     */
    public TimePickerPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        handleCustomAttributes(context, attrs);
        initialize();
    }

    /**
     * @param context
     * @param attrs
     * @param defStyle
     */
    public TimePickerPreference(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
        handleCustomAttributes(context, attrs);
        initialize();
    }

    private void handleCustomAttributes(Context context, AttributeSet attrs){
        TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.TimePickerPreference);
        CharSequence timeByDefaultCS = arr.getString(R.styleable.TimePickerPreference_timeByDefault);
        if (null != timeByDefaultCS){
            setTimeByDefault(timeByDefaultCS.toString());
        }
    }

    public void setTimeByDefault(Object defaultValue) {
        setDefaultValue(defaultValue);
    }

现在我们在“/ res / values /”文件夹的“attrs.xml”文件中创建属性,并添加以下资源:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="TimePickerPreference">
        < attr name="timeByDefault" format="string" />
    </declare-styleable>
</resources>

从xml访问新属性非常重要将在开头声明 xmlns:custom =“http://schemas.android.com/apk/res-auto”我们的xml文件的方式如下所示。

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    >
    <PreferenceCategory android:title="Notifications">

        <com.mypackage.TimePickerPreference 
            android:key="KEY_TO_SAVE_THE_TIME_IN_PREFERENCE"
            android:title="My custom title"
            android:summary="My detail"
            android:dialogTitle="My dialog title"
            custom:timeByDefault="07:30"
            />

    </PreferenceCategory>

</PreferenceScreen>

现在我将解释取消日期变更的问题:

打开对话框可让我们接受或取消新时间。无论您做什么,此组件都会接受始终时间。所以我创建了一个变量来临时存储真正引入的中间私有时间,直到接受该值。

private String tmpPersistString = "";

替换以下函数,如下所示:

@Override
public void onTimeChanged(TimePicker view, int hour, int minute) {
    tmpPersistString = hour + ":" + minute;
}

同样我们控制何时按下两个按钮之一,当我们按下接受它然后我们存储新时间的值:

@Override
public void onClick(DialogInterface dialog, int which) {
    super.getDialog().getCurrentFocus().clearFocus();
    super.onClick(dialog, which);
    if (which != -2){
        persistString(tmpPersistString);
        tmpPersistString = "";
    }
}

虽然如果您有物理键盘,或者返回按钮或在窗口外点击,如果按下 ESC 键关闭对话框,则不必完全初始化临时变量接地。

@Override
public void onDismiss(DialogInterface dialog) {
    super.onDismiss(dialog);
    tmpPersistString = "";

}

我只能希望你已经足够了解这个组件在开发时是一个不错的选择,它将对更多人有用。问候!