一. 问题提出


      在Android程序中,我们通常需要使用DatePicker来设置日期,TimePicker来设置时间。其基本步骤是:
             1.先定义DatePicker和TimePicker布局
             2.然后通过Calendar类获得系统时间
             3.接着通过init方法将日期传递给DatePicker初始化日期控件
             4.在响应点击事件中可以通过DatePicker的getYear()、getDayOfMonth()、getMonth()函数获取具体日期
      同时可以在OnDateChangedListener事件中监听日期变化,设置时间函数方法同理。但是使用DatePickerDialog或TimePickerDialog控件时会遇到的一个问题,它就是android版本4.0后没有取消(Cancel)按钮,同时点击界面任何部分都能获取日期或时间,据说它是版本存在的BUG。对比图如下所示:
  
      但是我们期待的效果如下图所示:
         我采取的解决方法是通过自定义XML布局,经过DatePicker和TimePicker控件实现,同时在AlertDialog中设置取消按钮和确定按钮,通过函数setNegativeButton()和setPositiveButton()实现。

二. 简单实现日期和时间控件


      简单实现方法非常简单,不需要设置日期或时间的XML布局,直接通过new DatePickerDialog或TimePickerDialog即可实现。代码如下:
//点击"日期"按钮布局 设置日期layoutDate.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener() {@Overridepublic void onDateSet(DatePicker view, int year, int month, int day) {// TODO Auto-generated method stubmYear = year;mMonth = month;mDay = day;//更新EditText控件日期 小于10加0dateEdit.setText(new StringBuilder().append(mYear).append("-")    .append((mMonth + 1) < 10 ? "0" + (mMonth + 1) : (mMonth + 1))                    .append("-")    .append((mDay < 10) ? "0" + mDay : mDay) ); }}, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH) ).show();}});
      其中mYear、mMonth、mDay是定义变量,同时dateEdit是一个EditText控件用于显示具体日期,当数字小于10时前补0,如2015-01-01。下面是设置时间,显示效果和第三部分的效果相同。
//点击"时间"按钮布局 设置时间layoutTime.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {new TimePickerDialog(MainActivity.this,new TimePickerDialog.OnTimeSetListener() {@Overridepublic void onTimeSet(TimePicker view, int hour, int minute) {// TODO Auto-generated method stubmHour = hour;mMinute = minute;//更新EditText控件时间 小于10加0timeEdit.setText(new StringBuilder().append(mHour < 10 ? "0" + mHour : mHour).append(":").append(mMinute < 10 ? "0" + mMinute : mMinute).append(":00") ); }}, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), true).show();}});

三. 自定义布局实现


      下面是自定义布局实现,而且我自认为该界面布局非常好看,这也是我“随手拍”项目自己最后总结出来的一个比较欣赏的界面吧!希望你也喜欢,效果如下:
     
      如图所示,界面中日期、时间EditText不可编辑,需要通过点击底部布局来设置。同时备注信息的EditText通过自定义背景实现,设置日期、时间中有取消按钮。
      源代码: 
     1.项目结构如下图所示
      2.activity_main.xml布局文件
<?xml version="1.0" encoding="UTF-8"?>                                                                                                                                                                                                                                                                                                                                                                                                                     
      3.date_dialog.xml文件:日期控件布局
<?xml version="1.0" encoding="utf-8"?>                     
      4.time_dialog.xml文件:时间控件布局
<?xml version="1.0" encoding="utf-8"?>                     
      5.drawable-hdpi中editview_shape.xml文件 实现自定义EditText控件格式
<?xml version="1.0" encoding="utf-8"?>           
      6.MainActivity.java源码
public class MainActivity extends Activity {//自定义变量private EditText titleEdit;private EditText dateEdit;private EditText timeEdit;private EditText contentEdit;//底部四个布局按钮private LinearLayout layoutDate;             private LinearLayout layoutTime;          private LinearLayout layoutCancel;              private LinearLayout layoutSave;//定义显示时间控件private Calendar calendar; //通过Calendar获取系统时间private int mYear;private int mMonth;private int mDay;private int mHour;private int mMinute;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //锁定屏幕      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);        setContentView(R.layout.activity_main);        //获取对象        titleEdit = (EditText) findViewById(R.id.showtitle);        dateEdit = (EditText) findViewById(R.id.showdate);timeEdit = (EditText) findViewById(R.id.showtime);contentEdit = (EditText) findViewById(R.id.editText1);        layoutDate = (LinearLayout) findViewById(R.id.layout_date);layoutTime = (LinearLayout) findViewById(R.id.layout_time);layoutCancel = (LinearLayout) findViewById(R.id.layout_cancel);layoutSave = (LinearLayout) findViewById(R.id.layout_save);calendar = Calendar.getInstance();        //点击"日期"按钮布局 设置日期layoutDate.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//通过自定义控件AlertDialog实现AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);View view = (LinearLayout) getLayoutInflater().inflate(R.layout.date_dialog, null);final DatePicker datePicker = (DatePicker) view.findViewById(R.id.date_picker);//设置日期简略显示 否则详细显示 包括:星期\周datePicker.setCalendarViewShown(false);//初始化当前日期calendar.setTimeInMillis(System.currentTimeMillis());datePicker.init(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), null); //设置date布局builder.setView(view);builder.setTitle("设置日期信息");builder.setPositiveButton("确  定", new DialogInterface.OnClickListener() {                     @Override                     public void onClick(DialogInterface dialog, int which) {                     //日期格式                        StringBuffer sb = new StringBuffer();                         sb.append(String.format("%d-%02d-%02d",                                  datePicker.getYear(),                                  datePicker.getMonth() + 1,                                 datePicker.getDayOfMonth()));                         dateEdit.setText(sb);                         //赋值后面闹钟使用                        mYear = datePicker.getYear();mMonth = datePicker.getMonth();mDay = datePicker.getDayOfMonth();                        dialog.cancel();                     }             }); builder.setNegativeButton("取  消", new DialogInterface.OnClickListener() {                     @Override                     public void onClick(DialogInterface dialog, int which) {                     dialog.cancel();                     }});builder.create().show();}});layoutDate.setOnTouchListener(new OnTouchListener() { //设置布局背景@Override    public boolean onTouch(View v, MotionEvent event) {                       if(event.getAction() == MotionEvent.ACTION_DOWN)  {        layoutDate.setBackgroundColor(Color.WHITE);        layoutTime.setBackgroundColor(Color.TRANSPARENT);        layoutCancel.setBackgroundColor(Color.TRANSPARENT);        layoutSave.setBackgroundColor(Color.TRANSPARENT);        }        return false;}});//点击"时间"按钮布局 设置时间layoutTime.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//自定义控件AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);View view = (LinearLayout) getLayoutInflater().inflate(R.layout.time_dialog, null);final TimePicker timePicker = (TimePicker) view.findViewById(R.id.time_picker);//初始化时间calendar.setTimeInMillis(System.currentTimeMillis());timePicker.setIs24HourView(true);         timePicker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));         timePicker.setCurrentMinute(Calendar.MINUTE); //设置time布局builder.setView(view);builder.setTitle("设置时间信息");builder.setPositiveButton("确  定", new DialogInterface.OnClickListener() {                     @Override                     public void onClick(DialogInterface dialog, int which) {                     mHour = timePicker.getCurrentHour();                    mMinute = timePicker.getCurrentMinute();                    //时间小于10的数字 前面补0 如01:12:00                    timeEdit.setText(new StringBuilder().append(mHour < 10 ? "0" + mHour : mHour).append(":").append(mMinute < 10 ? "0" + mMinute : mMinute).append(":00") );                         dialog.cancel();                     }             }); builder.setNegativeButton("取  消", new DialogInterface.OnClickListener() {                     @Override                     public void onClick(DialogInterface dialog, int which) {                     dialog.cancel();                     }});builder.create().show();}});layoutTime.setOnTouchListener(new OnTouchListener() { //设置布局背景@Override    public boolean onTouch(View v, MotionEvent event) {                       if(event.getAction() == MotionEvent.ACTION_DOWN)  {        layoutDate.setBackgroundColor(Color.TRANSPARENT);        layoutTime.setBackgroundColor(Color.WHITE);        layoutCancel.setBackgroundColor(Color.TRANSPARENT);        layoutSave.setBackgroundColor(Color.TRANSPARENT);        }        return false;}});//点击"取消"按钮layoutCancel.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {dateEdit.setText("");dateEdit.setHint("2015-01-01");timeEdit.setText("");timeEdit.setHint("00:00:00");contentEdit.setText("");contentEdit.setHint("记录旅途中的备注信息...");}});layoutCancel.setOnTouchListener(new OnTouchListener() { //设置布局背景@Override    public boolean onTouch(View v, MotionEvent event) {                       if(event.getAction() == MotionEvent.ACTION_DOWN)  {        layoutDate.setBackgroundColor(Color.TRANSPARENT);        layoutTime.setBackgroundColor(Color.TRANSPARENT);        layoutCancel.setBackgroundColor(Color.WHITE);        layoutSave.setBackgroundColor(Color.TRANSPARENT);        }        return false;}});//点击"保存"按钮layoutSave.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//确认保存按钮new AlertDialog.Builder(MainActivity.this).setTitle("确认保存吗?")             .setIcon(android.R.drawable.ic_dialog_info)             .setPositiveButton("确  定", new DialogInterface.OnClickListener() {                 @Override                 public void onClick(DialogInterface dialog, int which) {                             /**             * 数据库插入操作             */                                }                    })             .setNegativeButton("返  回", new DialogInterface.OnClickListener() {                 @Override                 public void onClick(DialogInterface dialog, int which) {                                 }             }).show(); }});layoutSave.setOnTouchListener(new OnTouchListener() { //设置布局背景@Override    public boolean onTouch(View v, MotionEvent event) {                       if(event.getAction() == MotionEvent.ACTION_DOWN)  {        layoutDate.setBackgroundColor(Color.TRANSPARENT);        layoutTime.setBackgroundColor(Color.TRANSPARENT);        layoutCancel.setBackgroundColor(Color.TRANSPARENT);        layoutSave.setBackgroundColor(Color.WHITE);        }        return false;}});} // End onCreate        }
      最后希望文章对大家有所帮助!如果你知道我这篇文章想要阐述的内容是什么?为什么要写这篇文章?或许它会对你有所帮助,一方面是布局可能对你有启发;另一方面就是刚好遇到那个问题的同学。
      在点击“保存”按钮时,也可把数据存储至数据库中调用MySQLiteOpenHelper,这里就不再介绍。写着写着就到了凌晨5点了,程序猿生活还是要改下啊~自己保重自己的身体吧!期待改正自己的作息,难难难~
      (By:Eastmount 2015-1-7 凌晨5点  http://blog.csdn.net/eastmount/

更多相关文章

  1. Python3原生编写月份计算工具
  2. 读oschina android 开源app代码 - 笔记。
  3. Android虚拟键(NavigationBar)适配
  4. Android性能优化篇:从布局角度进行优化
  5. Android(安卓)RelativeLayout 布局
  6. 【第一章-知识】2、性能优化-Bootchart 分析之Android(安卓)7.1
  7. Android定时的基本实现
  8. Android自定义滚动式时间选择器(在他人基础上修改)
  9. android 开机启动加速

随机推荐

  1. 函数参数与返回值 |模板字面量与模板函数
  2. 如何快速使用markdown
  3. 如何快速创建前端开发环境?
  4. 小程序保存图片到相册
  5. 先写API文档还是先写代码?
  6. Android的5层平台架构
  7. Android(安卓)解决沉浸式状态栏下,输入法
  8. Android(安卓)自定义View(一)原理
  9. Android(安卓)NDK开发之旅(3): 详解JNI数
  10. Android(安卓)从硬件到应用:一步一步向上