Во-первых, я прошу прощения за мой английский, я тяну переводчиков. Я знаю, что ветка старая, но я искал информацию по этой проблеме сегодня, и Надя не нашла решения. Что, если это случится с кем-то еще здесь, я ухожу. У этого компонента также есть ошибка, что если вы отменяете вставку времени, оно всегда сохраняется. Также прокомментируйте свое решение.
Давайте начнем с главного: не совсем, почему он никогда не выбрасывает установщик значения по умолчанию, и самым быстрым решением было бы ручное управление компоновщиками элементов. Я лично решил создать новый атрибут с именем "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 = "";
}
Я могу только надеяться, что вы поняли достаточно, чтобы сделать этот компонент хорошим выбором во время разработки, и он будет полезен большему количеству людей. Приветствие!