最近在做一个项目,要求选择时间的控件是同时选择日期和小时和分钟,但是android中系统只有单独的日期DatePicker和TimePicker,所以就要自己写来组合一下。
首先是布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:focusable="true" android:focusableInTouchMode="true" android:orientation="vertical" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <DatePicker android:id="@+id/DatePicker" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <TimePicker android:id="@+id/TimePicker" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> </LinearLayout>
布局文件很简单,把焦点设给父亲布局是为了不要一点开这个控件就弹出键盘。
代码如下:
package cn.com.egova.mobileinspector.community.view; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; import cn.com.egova.mobileinspector.R; import cn.com.egova.mobileinspector.constance.Format; import android.app.Activity; import android.app.AlertDialog; import android.app.DatePickerDialog; import android.app.DatePickerDialog.OnDateSetListener; import android.app.TimePickerDialog; import android.app.TimePickerDialog.OnTimeSetListener; import android.content.Context; import android.content.DialogInterface; import android.graphics.Color; import android.util.AttributeSet; import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.widget.Button; import android.widget.DatePicker; import android.widget.DatePicker.OnDateChangedListener; import android.widget.LinearLayout; import android.widget.TimePicker; import android.widget.TimePicker.OnTimeChangedListener; import android.widget.Toast; public class DateTimeButton extends Button { public Calendar time = Calendar.getInstance(Locale.CHINA); public static final SimpleDateFormat format = new SimpleDateFormat(Format.DATA_FORMAT_YMDHMS_EN.toString()); private DatePicker datePicker; private TimePicker timePicker; private Button dataView; private AlertDialog dialog; // private Activity activity; public DateTimeButton(Context context, AttributeSet attrs) { super(context, attrs); init(); } public DateTimeButton(Context context) { super(context); init(); } //增加构造器 public DateTimeButton(Context context,Button dataView){ super(context); this.dataView = dataView; } public AlertDialog dateTimePickerDialog(){ LinearLayout dateTimeLayout = (LinearLayout)LayoutInflater.from(getContext()).inflate(R.layout.date_time_picker, null); datePicker = (DatePicker) dateTimeLayout.findViewById(R.id.DatePicker); timePicker = (TimePicker) dateTimeLayout.findViewById(R.id.TimePicker); if(dataView == null) init(); timePicker.setIs24HourView(true); OnTimeChangedListener timeListener= new OnTimeChangedListener() { @Override public void onTimeChanged(TimePicker view, int hourOfDay, int minute) { // TODO Auto-generated method stub time.set(Calendar.HOUR_OF_DAY, hourOfDay); time.set(Calendar.MINUTE, minute); } }; timePicker.setOnTimeChangedListener(timeListener); OnDateChangedListener dateListener = new OnDateChangedListener() { @Override public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) { // TODO Auto-generated method stub time.set(Calendar.YEAR, year); time.set(Calendar.MONTH, monthOfYear); time.set(Calendar.DAY_OF_MONTH, dayOfMonth); } }; datePicker.init(time.get(Calendar.YEAR), time.get(Calendar.MONTH), time.get(Calendar.DAY_OF_MONTH), dateListener); timePicker.setCurrentHour(time.get(Calendar.HOUR_OF_DAY)); timePicker.setCurrentMinute(time.get(Calendar.MINUTE)); dialog = new AlertDialog.Builder(getContext()).setTitle("设置日期时间").setView(dateTimeLayout) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub time.set(Calendar.YEAR, datePicker.getYear()); time.set(Calendar.MONTH, datePicker.getMonth()); time.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth()); time.set(Calendar.HOUR_OF_DAY, timePicker.getCurrentHour()); time.set(Calendar.MINUTE, timePicker.getCurrentMinute()); updateLabel(); } }).setNegativeButton("取消", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub } }).show(); return dialog; } /** * */ private void init() { this.setBackgroundResource(R.drawable.datebutton_bg); this.setGravity(Gravity.LEFT); this.setTextColor(Color.BLACK); this.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 生成一个DatePickerDialog对象,并显示。显示的DatePickerDialog控件可以选择年月日,并设置 dateTimePickerDialog(); } }); updateLabel(); } /** * 更新标签 */ public void updateLabel() { if(dataView != null){ dataView.setText(format.format(time.getTime())); } this.setText(format.format(time.getTime())); } /** * @return 获得时间字符串"yyyy-MM-dd HH:mm:ss" */ public String getDateString() { return format.format(time.getTime()); } public void setDate(String datestr){ try { time.setTime(format.parse(datestr)); updateLabel(); } catch (ParseException e) { e.printStackTrace(); } } }
按理说这样就行了,我之前以为也是这样,因为为测试了,是OK的,但是只要你点击控件上的加减来修改日期或者时间,点击确定那么是可以修改和保存成功的,可是大家都知道,日期控件和时间控件里面的输入框是可以手动输入的,这样我才发现如果我手输,点击确定,时间没有进行修改,这可难住我了。
还好,我经过点击发现,在一个输入框中修改了数字之后直接点击确定,那么是没有响应timechangelisterner的或者datechangelisterner,都没有响应,但是输入之后,移到另外一个输入框,这个时候就响应了,同时时间也被修改了,所以我想到了,在输入完成后,点击确定的时候,将DatePicker和TimePicker的焦点清除不就行了。于是,请在代码的103行加入这两句:
datePicker.clearFocus(); timePicker.clearFocus();
这样就搞定了,经过测试,没问题。
相关推荐
简单,好用的日期和时间选择器
Android强大的日期时间选择控件 安卓 android 日期时间 控件 datepicker
android 日期区间选择控件 年月区间选择
android日期时间选择器,可日期时间同时选择。参考https://github.com/liuwan1992/CustomDatePicker
Android 日期和时间选择器合并
在Android App上同时选择年月日和当前时间
Kotlin语言写安卓项目 选择日期范围,刷新选择的时间区间所检索的数据 在某大牛原控件的基础上,做了一个拓展使用,可解决一些原控件的bug问题。 文内只写了日期的选择使用,时间的选择类似,详情可参照博客内容: ...
android 同时选择时间和日期,仿iPhone样式
android 时间选择器,其搞定时间日期选择。又好用代码的,大家互相发一下,相互学习
此DEMO为android studio项目,带有开始时间和结束时间的日期选择器,由于屏幕宽度有限,两个时间选择器为竖向串联模式。
配套博客地址:http://blog.csdn.net/wwj_748/article/details/38778631
可以同时显示日期加时间,或者只显示日期
实现了Android开发自定义年月日日期选择器,时分时间选择器
android滚轮,可实现日期,文字,时间滚动选择
19. android dialog —— 日期和时间选择对话框
android 日期时间选择对话框 简单易懂新手专用的简单例子
这是一个仿苹果的时间选择器,可自己修改背景,字体,代码内有注释很清楚了
Android 自定义 弹框,日期选择器 弹框,年月日,时分,
Android中日期选择器、时间选择器、计时器、进度条的使用示例代码
博客地址 : http://blog.csdn.net/lv_fq/article/details/51957721