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

Android自定义View—自定义的DatePicker

2015-06-15 15:16 561 查看
谷歌官方提供了日期选择器(DatePicker)、时间选择器(TimePicker),是android项目实战中,并不会直接使用这样的一个控件,而且原生的其实挺难看的。在实际的应用中,可能会出现在网址中有个日期或者在android中有个按钮,点击的时候弹出一个对话框,然后可以选择日期,并将选择的日期传递回去。前者用JS的交互可以做到,后者则只是单纯的按钮点击事件。

首先,在xml中,主布局用一个Linearlayout,里面包含两个布局跟一个高度为1dp的view(作为两个datepicker的分界),两个布局都采用相对布局,左边是一个文本框,显示“选择日期”,右边是一个Datepicker。然后在Main.xml中放一个Textview显示Datepicker传过来的数值,还有一个按钮可点击弹出对话框显示Datepicker。

写好xml之后就在java中添加代码,首先写一个类,继承AlertDialog。首先定义两个Datepicker中各个变量:

public interface OnDateSetListener {
void onDateSet(DatePicker startDatePicker, int startYear, int startMonthOfYear, int startDayOfMonth,
DatePicker endDatePicker, int endYear, int endMonthOfYear, int endDayOfMonth);
}
public DoubleDatePickerDialog(Context context, OnDateSetListener callBack, int year, int monthOfYear, int dayOfMonth) {
this(context, 0, callBack, year, monthOfYear, dayOfMonth);
}
public DoubleDatePickerDialog(Context context, int theme, OnDateSetListener callBack, int year, int monthOfYear,
int dayOfMonth) {
this(context, 0, callBack, year, monthOfYear, dayOfMonth, true);
}


然后设置一个dialog,并设置两个按钮,找到两个Datepicker以及里面的各个元素。

public DoubleDatePickerDialog(Context context, int theme, OnDateSetListener callBack, int year, int monthOfYear,
int dayOfMonth, boolean isDayVisible) {
super(context, theme);
mCallBack = callBack;
Context themeContext = getContext();
setButton(BUTTON_POSITIVE, "确 定", this);
setButton(BUTTON_NEGATIVE, "取 消", this);
setIcon(1);
LayoutInflater inflater = (LayoutInflater) themeContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.date_picker_dialog, null);
setView(view);
mDatePicker_start = (DatePicker) view.findViewById(R.id.datePickerStart);
mDatePicker_end = (DatePicker) view.findViewById(R.id.datePickerEnd);
mDatePicker_start.init(year, monthOfYear, dayOfMonth, this);
mDatePicker_end.init(year, monthOfYear, dayOfMonth, this);
}


监听两个Datepicker中各个子元素的改变事件:

public void onDateChanged(DatePicker view, int year, int month, int day) {
if (view.getId() == R.id.datePickerStart)
mDatePicker_start.init(year, month, day, this);
if (view.getId() == R.id.datePickerEnd)
mDatePicker_end.init(year, month, day, this);
}
//获得开始日期的datepicker
public DatePicker getDatePickerStart() {
return mDatePicker_start;
}
public void updateStartDate(int year, int monthOfYear, int dayOfMonth) {
mDatePicker_start.updateDate(year, monthOfYear, dayOfMonth);
}
//获得结束日期的datepicker
public DatePicker getDatePickerEnd() {
return mDatePicker_end;
}
public void updateEndDate(int year, int monthOfYear, int dayOfMonth) {
mDatePicker_end.updateDate(year, monthOfYear, dayOfMonth);
}
//得到两个datepicker中各个子元素当前的数值
private void tryNotifyDateSet() {
if (mCallBack != null) {
mDatePicker_start.clearFocus();
mDatePicker_end.clearFocus();
mCallBack.onDateSet(mDatePicker_start, mDatePicker_start.getYear(), mDatePicker_start.getMonth(),
mDatePicker_start.getDayOfMonth(), mDatePicker_end, mDatePicker_end.getYear(),
mDatePicker_end.getMonth(), mDatePicker_end.getDayOfMonth());
}
}
//将获得的数值转换成Int类型
public Bundle onSaveInstanceState() {
Bundle state = super.onSaveInstanceState();
state.putInt(START_YEAR, mDatePicker_start.getYear());
state.putInt(START_MONTH, mDatePicker_start.getMonth());
state.putInt(START_DAY, mDatePicker_start.getDayOfMonth());
state.putInt(END_YEAR, mDatePicker_end.getYear());
state.putInt(END_MONTH, mDatePicker_end.getMonth());
state.putInt(END_DAY, mDatePicker_end.getDayOfMonth());
return state;
}
//将各个Int类型的值赋给对应的自定义的int
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
int start_year = savedInstanceState.getInt(START_YEAR);
int start_month = savedInstanceState.getInt(START_MONTH);
int start_day = savedInstanceState.getInt(START_DAY);
mDatePicker_start.init(start_year, start_month, start_day, this);

int end_year = savedInstanceState.getInt(END_YEAR);
int end_month = savedInstanceState.getInt(END_MONTH);
int end_day = savedInstanceState.getInt(END_DAY);
mDatePicker_end.init(end_year, end_month, end_day, this);
}


这样,自定义的dialog形式的datepicker就写好了。接下来在activity中引用这个类,首先先找到xml中的textview跟Button控件,并且给按钮添加一个点击事件,点击的时候就弹出对话框,对话框显示的是一个将xml实例化的view。

btn.setOnClickListener(new View.OnClickListener() {
Calendar c = Calendar.getInstance();
@Override
public void onClick(View v) {
new DoubleDatePickerDialog(MainActivity.this, 0, new DoubleDatePickerDialog.OnDateSetListener() {
@SuppressLint("DefaultLocale")
@Override
public void onDateSet(DatePicker startDatePicker, int startYear, int startMonthOfYear,
int startDayOfMonth, DatePicker endDatePicker, int endYear, int endMonthOfYear,
int endDayOfMonth) {
String textString = String.format("开始时间:%d-%d-%d\n结束时间:%d-%d-%d\n", startYear,
startMonthOfYear + 1, startDayOfMonth, endYear, endMonthOfYear + 1, endDayOfMonth);
et.setText(textString);
}
}, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DATE)).show();
}
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: