Установить значение по умолчанию для TimePickerPreference - PullRequest
0 голосов
/ 14 мая 2011

Я использую эту реализацию TimePickerPreference: http://www.ebessette.com/d/TimePickerPreference

Работает хорошо.Но я не знаю, как установить для него значение по умолчанию.Поэтому, если предпочтение вызывается в первый раз, оно должно показывать текущее время.Я также хотел бы расширить его, чтобы показать выбранное время в заголовке.

В моем предпочтении.xml:

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

Ответы [ 2 ]

1 голос
/ 14 мая 2011

Может быть, этот код поможет вам TimePickerPreference.java

0 голосов
/ 17 декабря 2013

Во-первых, я прошу прощения за мой английский, я тяну переводчиков. Я знаю, что ветка старая, но я искал информацию по этой проблеме сегодня, и Надя не нашла решения. Что, если это случится с кем-то еще здесь, я ухожу. У этого компонента также есть ошибка, что если вы отменяете вставку времени, оно всегда сохраняется. Также прокомментируйте свое решение.

Давайте начнем с главного: не совсем, почему он никогда не выбрасывает установщик значения по умолчанию, и самым быстрым решением было бы ручное управление компоновщиками элементов. Я лично решил создать новый атрибут с именем "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);
    }

Теперь мы создаем атрибут в файле attrs.xml в папке "/ res / values ​​/" и добавляем следующий ресурс:

<?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 = "";

}

Я могу только надеяться, что вы поняли достаточно, чтобы сделать этот компонент хорошим выбором во время разработки, и он будет полезен большему количеству людей. Приветствие!

...