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中各个变量:
然后设置一个dialog,并设置两个按钮,找到两个Datepicker以及里面的各个元素。
监听两个Datepicker中各个子元素的改变事件:
这样,自定义的dialog形式的datepicker就写好了。接下来在activity中引用这个类,首先先找到xml中的textview跟Button控件,并且给按钮添加一个点击事件,点击的时候就弹出对话框,对话框显示的是一个将xml实例化的view。
首先,在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(); } });
相关文章推荐
- androidの监听EditView中的文本TextWatcher
- Android ViewDragHelper 实现 QQ5.0 侧滑
- Openfire + Smack 4.1.1 搭建Android聊天平台
- Android实用方法—返回键的监听
- Android优化系列——性能优化(资源存储)
- Android自定义View的实现方法,带你一步步深入了解View(四)
- Android报错"case expressions must be constant expressions"
- Design Support Library —— TextInputLayout
- android之ScrollView里嵌套ListView(转)
- drawableLeft
- AndroidManifest笔记
- android 中layer-list的用法
- android 开发:shape和selector和layer-list的(详细说明)
- cannot resolve symbol r android studio
- Android搜索框/滚动视图/notification
- Android带清除按钮的文本框
- Android横向滚动屏幕特效分析
- android studio社区
- Android编程之ButterKnife
- VLC for Android : 编译问题 & 解决办法