Как использовать DatePickerDialog как предпочтение

У меня есть настройки, и я использую комбинацию CheckBoxPreference и EditTextPreference. Я хотел бы заменить один из них DatePickerDialog.

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

У меня есть диалог выбора даты, который работает с обычного вида (согласно учебнику), но я хотел бы использовать его с предпочтением.

Solutions Collecting From Web of "Как использовать DatePickerDialog как предпочтение"

Вам нужно будет создать пользовательский DialogPreference включающий DatePicker . Вот проект, показывающий пользовательский DialogPreference на основе пользовательского виджета ColorMixer .

Благодаря @commonsware. Я выполнил его проект и создал диалог предпочтений выбора даты. Так что это поможет кому-то.

Выполните шаги, чтобы открыть окно выбора даты в окне предпочтений.

1. Создайте пользовательский диалог для выбора даты.

 package com.packagename; import java.text.SimpleDateFormat; import java.util.Calendar; import android.content.Context; import android.content.res.TypedArray; import android.preference.DialogPreference; import android.util.AttributeSet; import android.view.View; import android.widget.DatePicker; public class DatePreference extends DialogPreference { private int lastDate = 0; private int lastMonth = 0; private int lastYear = 0; private String dateval; private CharSequence mSummary; private DatePicker picker = null; public static int getYear(String dateval) { String[] pieces = dateval.split("-"); return (Integer.parseInt(pieces[0])); } public static int getMonth(String dateval) { String[] pieces = dateval.split("-"); return (Integer.parseInt(pieces[1])); } public static int getDate(String dateval) { String[] pieces = dateval.split("-"); return (Integer.parseInt(pieces[2])); } public DatePreference(Context ctxt, AttributeSet attrs) { super(ctxt, attrs); setPositiveButtonText("Set"); setNegativeButtonText("Cancel"); } @Override protected View onCreateDialogView() { picker = new DatePicker(getContext()); // setCalendarViewShown(false) attribute is only available from API level 11 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { picker.setCalendarViewShown(false); } return (picker); } @Override protected void onBindDialogView(View v) { super.onBindDialogView(v); picker.updateDate(lastYear, lastMonth + 1, lastDate); } @Override protected void onDialogClosed(boolean positiveResult) { super.onDialogClosed(positiveResult); if (positiveResult) { lastYear = picker.getYear(); lastMonth = picker.getMonth(); lastDate = picker.getDayOfMonth(); String dateval = String.valueOf(lastYear) + "-" + String.valueOf(lastMonth) + "-" + String.valueOf(lastDate); if (callChangeListener(dateval)) { persistString(dateval); } } } @Override protected Object onGetDefaultValue(TypedArray a, int index) { return (a.getString(index)); } @Override protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { dateval = null; if (restoreValue) { if (defaultValue == null) { Calendar cal = Calendar.getInstance(); SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd"); String formatted = format1.format(cal.getTime()); dateval = getPersistedString(formatted); } else { dateval = getPersistedString(defaultValue.toString()); } } else { dateval = defaultValue.toString(); } lastYear = getYear(dateval); lastMonth = getMonth(dateval); lastDate = getDate(dateval); } public void setText(String text) { final boolean wasBlocking = shouldDisableDependents(); dateval = text; persistString(text); final boolean isBlocking = shouldDisableDependents(); if (isBlocking != wasBlocking) { notifyDependencyChange(isBlocking); } } public String getText() { return dateval; } public CharSequence getSummary() { return mSummary; } public void setSummary(CharSequence summary) { if (summary == null && mSummary != null || summary != null && !summary.equals(mSummary)) { mSummary = summary; notifyChanged(); } } } 

2. Добавьте следующий код в префикс xml, расположенный в «res / xml / yourpreference.xml»,

 <com.packagename.DatePreference android:key="keyname" android:title="Title of the preference" android:defaultValue="2014-08-01" android:summary="Summary"/> 

Примечание. Измените «имя ключа», «Название предпочтения», «2014-08-01», «резюме» по вашему требованию

3. Если вы хотите изменить ваули по умолчанию с помощью операции «Назначение», используйте следующий код.

 package com.packagename; import android.os.Bundle; import com.packagename.DatePreference; public class CustomPreference extends PreferenceActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.preferences); final DatePreference dp= (DatePreference) findPreference("keyname"); dp.setText("2014-08-02"); dp.setSummary("2014-08-02"); dp.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference preference,Object newValue) { //your code to change values. dp.setSummary((String) newValue); return true; } }); } } 

Теперь наслаждайтесь …

Вот реализация, готовая к использованию в вашем проекте как lib.

Чтобы указать источник:

Используйте его так же, как и любые другие предпочтения в вашем XML-экране PreferenceScreen:

 <org.bostonandroid.datepreference.DatePreference android:key="dob" android:title="@string/dob" android:defaultValue="1991.01.01" /> 

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

Единственная проблема заключается в том, что default.jardesc недоступен, но может быть легко выполнен из соответствующего в проекте DatePicker.