我有偏好工作,我正在使用CheckBoxPreference和EditTextPreference的组合。我想用DatePickerDialog替换其中的一个。如何使用DatePickerDialog作为首选项
当我的设置屏幕显示时,如果您点击其中一个首选项,我会弹出日期选取器对话框供用户选择一个日期,并将所选日期保存在首选项中。我在其他应用程序中看到过这项工作,但我无法看到如何执行此操作。
我有日常选择器对话框从常规视图(按照教程)工作,但我想从首选项中使用它。
我有偏好工作,我正在使用CheckBoxPreference和EditTextPreference的组合。我想用DatePickerDialog替换其中的一个。如何使用DatePickerDialog作为首选项
当我的设置屏幕显示时,如果您点击其中一个首选项,我会弹出日期选取器对话框供用户选择一个日期,并将所选日期保存在首选项中。我在其他应用程序中看到过这项工作,但我无法看到如何执行此操作。
我有日常选择器对话框从常规视图(按照教程)工作,但我想从首选项中使用它。
您需要创建一个自定义DialogPreference
合并DatePicker
。 Here is a project显示基于自定义ColorMixer
小部件的自定义DialogPreference
。
Here是一个可以在项目中作为lib使用的实现。
要注明出处:
使用它,就像在你的PreferenceScreen XML任何其他偏好:
<org.bostonandroid.datepreference.DatePreference
android:key="dob" android:title="@string/dob"
android:defaultValue="1991.01.01" />
在寻找一个TimePicker的喜好来使用,我发现这个线程。 我想指出,该回购中还有一个TimePicker项目(link)。
唯一的问题是,default.jardesc不可用,但可以很容易地从DatePicker项目中的相应的一个。
感谢@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。添加以下代码在位于 “RES/XML/yourpreference.xml”
<com.packagename.DatePreference
android:key="keyname"
android:title="Title of the preference"
android:defaultValue="2014-08-01"
android:summary="Summary"/>
注意偏好的xml:改变 “键名”, “首选项的标题”, “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;
}
});
}
}
享受现在......
嗨,你为什么做onDialogClosed的本地另一个dateval? – user3290180 2015-07-20 12:59:40
那里有一个小错误应该是+1 – user1209216 2015-11-18 09:29:33
这很好。但在所有日期和时间的例子中,我都看到人们使用硬编码日期格式。在许多国家,日期格式不同。您应该使用设备的本地日期格式! – Roel 2016-02-09 10:17:55
这帮助了我很多,谢谢。我创建了一个自定义类,但是现在我怎样才能将其添加到现有的首选项中?我现有的首选项是用XML定义的。我如何添加它并使其成为我十个偏好中的第三个? – mlw 2010-11-18 16:57:47
@MLW:只需将其添加为一个元素即可。您需要完全限定类名(例如'')。 –
CommonsWare
2010-11-18 17:38:04
谢谢,这个工程! – mlw 2010-11-18 18:28:18