您的位置:首页 > 移动开发 > Android开发

android 日期时间选择器

2016-06-15 17:06 477 查看
在做项目时,需要使用时间选择器,找了DatePickerDialog来选择显示日期时间。在这总结一下怎么去使用和遇到的一些问题及解决方法



首先需要两个类:DateTimePicker.java DateTimePickerDialog.java。包括dialog的布局和实现回掉方法。

DateTimePicker.java

public class DateTimePicker extends FrameLayout
{
private final NumberPicker mDateSpinner;
private final NumberPicker mHourSpinner;
private final NumberPicker mMinuteSpinner;
private Calendar mDate;
private int mHour,mMinute;
private String[] mDateDisplayValues = new String[7];
private OnDateTimeChangedListener mOnDateTimeChangedListener;

public DateTimePicker(Context context)
{
super(context);
mDate = Calendar.getInstance();

mHour=mDate.get(Calendar.HOUR_OF_DAY);
mMinute=mDate.get(Calendar.MINUTE);

inflate(context, R.layout.datedialog, this);

mDateSpinner=(NumberPicker)this.findViewById(R.id.np_date);
mDateSpinner.setMinValue(0);
mDateSpinner.setMaxValue(6);
updateDateControl();
mDateSpinner.setOnValueChangedListener(mOnDateChangedListener);

mHourSpinner=(NumberPicker)this.findViewById(R.id.np_hour);
mHourSpinner.setMaxValue(23);
mHourSpinner.setMinValue(0);
mHourSpinner.setValue(mHour);
mHourSpinner.setOnValueChangedListener(mOnHourChangedListener);

mMinuteSpinner=(NumberPicker)this.findViewById(R.id.np_minute);
mMinuteSpinner.setMaxValue(59);
mMinuteSpinner.setMinValue(0);
mMinuteSpinner.setValue(mMinute);
mMinuteSpinner.setOnValueChangedListener(mOnMinuteChangedListener);
}

private NumberPicker.OnValueChangeListener mOnDateChangedListener=new OnValueChangeListener()
{
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal)
{
mDate.add(Calendar.DAY_OF_MONTH, newVal - oldVal);
updateDateControl();
onDateTimeChanged();
}
};

private NumberPicker.OnValueChangeListener mOnHourChangedListener=new OnValueChangeListener()
{
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal)
{
mHour=mHourSpinner.getValue();
onDateTimeChanged();
}
};

private NumberPicker.OnValueChangeListener mOnMinuteChangedListener=new OnValueChangeListener()
{
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal)
{
mMinute=mMinuteSpinner.getValue();
onDateTimeChanged();
}
};

private void updateDateControl()
{
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(mDate.getTimeInMillis());
cal.add(Calendar.DAY_OF_YEAR, -7 / 2 - 1);
mDateSpinner.setDisplayedValues(null);
for (int i = 0; i < 7; ++i)
{
cal.add(Calendar.DAY_OF_YEAR, 1);
mDateDisplayValues[i] = (String) DateFormat.format("MM.dd EEEE", cal);
}
mDateSpinner.setDisplayedValues(mDateDisplayValues);
mDateSpinner.setValue(7 / 2);
mDateSpinner.invalidate();
}

public interface OnDateTimeChangedListener
{
void onDateTimeChanged(DateTimePicker view, int year, int month, int day,int hour,int minute);
}

public void setOnDateTimeChangedListener(OnDateTimeChangedListener callback)
{
mOnDateTimeChangedListener = callback;
}

private void onDateTimeChanged()
{
if (mOnDateTimeChangedListener != null)
{
mOnDateTimeChangedListener.onDateTimeChanged(this, mDate.get(Calendar.YEAR),
mDate.get(Calendar.MONTH), mDate.get(Calendar.DAY_OF_MONTH),mHour, mMinute);
}
}
}


DateTimePickerDialog.java

public class DateTimePickerDialog extends AlertDialog implements OnClickListener
{
private DateTimePicker mDateTimePicker;
private Calendar mDate = Calendar.getInstance();
private OnDateTimeSetListener mOnDateTimeSetListener;

@SuppressWarnings("deprecation")
public DateTimePickerDialog(Context context, long date)
{
super(context);
mDateTimePicker = new DateTimePicker(context);
setView(mDateTimePicker);
mDateTimePicker.setOnDateTimeChangedListener(new OnDateTimeChangedListener()
{
@Override
public void onDateTimeChanged(DateTimePicker view, int year, int month, int day, int hour, int minute)
{
mDate.set(Calendar.YEAR, year);
mDate.set(Calendar.MONTH, month);
mDate.set(Calendar.DAY_OF_MONTH, day);
mDate.set(Calendar.HOUR_OF_DAY, hour);
mDate.set(Calendar.MINUTE, minute);
mDate.set(Calendar.SECOND, 0);
updateTitle(mDate.getTimeInMillis());
}
});

setButton("设置", this);
setButton2("取消", (OnClickListener)null);
mDate.setTimeInMillis(date);
updateTitle(mDate.getTimeInMillis());
}

public interface OnDateTimeSetListener
{
void OnDateTimeSet(AlertDialog dialog, long date);
}

private void updateTitle(long date)
{
int flag = DateUtils.FORMAT_SHOW_YEAR | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_WEEKDAY| DateUtils.FORMAT_SHOW_TIME;
setTitle(DateUtils.formatDateTime(this.getContext(), date, flag));
}

public void setOnDateTimeSetListener(OnDateTimeSetListener callBack)
{
mOnDateTimeSetListener = callBack;
}

public void onClick(DialogInterface arg0, int arg1)
{
if (mOnDateTimeSetListener != null)
{
mOnDateTimeSetListener.OnDateTimeSet(this, mDate.getTimeInMillis());
}
}
}


剩下的就是在activity中使用了

DateTimePickerDialog dialog  = new DateTimePickerDialog(this, System.currentTimeMillis());
dialog.setOnDateTimeSetListener(new OnDateTimeSetListener()
{
public void OnDateTimeSet(AlertDialog dialog, long date)
{
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateString = formatter.format(date);
Toast.makeText(getApplication(), dateString, Toast.LENGTH_SHORT).show();
}
});
dialog.show();


这样一个时间选择器就添加好了,可在这遇到一个问题,我的显示是这样的,好难看。。



查了一下,发现原因是在AndroidManifest.xml中,

activity的theme是android:theme=”@android:style/Theme.NoTitleBar”,在这种theme下的样式难看。

将样式改为android:theme=”@android:style/Theme.Holo.Light”就行了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息