Android UI组件之DatePicker,TimePicker

  一直都是在博客园和csdn上看各种大牛的技术博客,终于忍不住要开始自己写博客,希望一起成长,我会把自己的学习的过程放到博客里,但同时我更愿意贴出的是我碰到的错误。也欢迎网友来指导与纠正,大家一起进步,更希望的是自己能够坚持写博客。

  废话不多说,直接进入正题,最近在学习android开发,对于这些界面的开发,最重要的就是一堆控件的使用了。今天登场的就是DatePicker和TimePicker。既然要学习,那就需要有学习的资料。碰到一个新的东西最自然的想法就是去搜一下。网上相关的文章也是一大堆。再有了资料之后就可以入手设计了,对于日期和时间选择控件,最常用的大概就是获得选择结果。所以一个demo的功能就出来了:

  1.程序启动进入主界面,看到一个最简单的布局,提示用户选择开始时间和结束时间。

  2.用户触摸EditText时,触发onTouch事件。弹出datepicker dialog。

  3.用户选择日期和时间并确定。

  4.结果返回到EditText。

  有了程序的流程,接下来就来设计界面。首先是主界面activity_main.xml的布局文件:

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="fill_parent"
 4     android:layout_height="fill_parent"
 5     android:orientation="vertical"
 6     android:padding="10dip"
 7     tools:context=".MainActivity" >
 8     <RelativeLayout
 9         android:layout_width="fill_parent"
10         android:layout_height="wrap_content">
11         <TextView
12           android:id="@+id/startTextView"
13             android:layout_width="wrap_content"
14             android:layout_height="wrap_content"
15             android:gravity="center_vertical"
16             android:text="@string/start" />
17         <EditText
18               android:id="@+id/startEditText"
19             android:layout_width="fill_parent"
20             android:layout_height="wrap_content"
21             android:singleLine="true"
22             android:layout_toRightOf="@id/startTextView"/>
23     </RelativeLayout>
24     <RelativeLayout
25         android:layout_width="fill_parent"
26         android:layout_height="wrap_content">
27         <TextView
28           android:id="@+id/endTextView"
29             android:layout_width="wrap_content"
30             android:layout_height="wrap_content"
31             android:gravity="center_vertical"
32             android:text="@string/end" />
33         <EditText
34               android:id="@+id/endEditText"
35             android:layout_width="fill_parent"
36             android:layout_height="wrap_content"
37             android:singleLine="true"
38             android:layout_toRightOf="@id/endTextView"/>
39     </RelativeLayout>
40 </LinearLayout>

   界面效果如下:

  接下来是datepicker dialog的view布局datepicker.xml:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="fill_parent"
 4     android:layout_height="fill_parent"
 5     android:orientation="vertical"
 6     android:scrollbars="vertical">
 7     <TextView
 8         android:layout_width="wrap_content"
 9         android:layout_height="wrap_content"
10         android:textSize="16sp"
11         android:text="@string/datepicker"/>
12     <DatePicker
13         android:id="@+id/myDatePicker"
14         android:layout_width="fill_parent"
15         android:layout_height="wrap_content"
16         android:layout_marginTop="5dip"/>
17      <TextView
18         android:layout_width="wrap_content"
19         android:layout_height="wrap_content"
20         android:textSize="16sp"
21         android:text="@string/timepicker"/>
22      <TimePicker
23         android:id="@+id/myTimePicker"
24         android:layout_width="fill_parent"
25         android:layout_height="wrap_content"
26         android:layout_marginTop="5dip" />
27
28 </LinearLayout>

  界面效果如下:

  这效果,吓我一跳。怎么这样子。算了先不管了。等运行再看看。现在布局文件都有了那么就要开始程序的功能部分了。

  1 package com.example.datepickertest;
  2
  3 import java.util.Calendar;
  4
  5 import android.app.Activity;
  6 import android.app.AlertDialog;
  7 import android.content.DialogInterface;
  8 import android.os.Bundle;
  9 import android.text.InputType;
 10 import android.view.Menu;
 11 import android.view.MotionEvent;
 12 import android.view.View;
 13 import android.widget.DatePicker;
 14 import android.widget.EditText;
 15 import android.widget.TimePicker;
 16
 17 public class MainActivity extends Activity {
 18     //定义控件变量
 19     private EditText startEdit,endEdit;
 20     @Override
 21     protected void onCreate(Bundle savedInstanceState) {
 22         super.onCreate(savedInstanceState);
 23         setContentView(R.layout.activity_main);
 24         startEdit = (EditText) findViewById(R.id.startEditText);
 25         endEdit = (EditText) findViewById(R.id.endEditText);
 26         startEdit.setOnTouchListener(new MyTouchListener());
 27         endEdit.setOnTouchListener(new MyTouchListener());
 28     }
 29     class MyTouchListener implements View.OnTouchListener{
 30         @Override
 31         public boolean onTouch(View v, MotionEvent event) {
 32             // TODO Auto-generated method stub
 33             if(event.getAction() == MotionEvent.ACTION_DOWN){
 34                 AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
 35                 View view = View.inflate(MainActivity.this,R.layout.datepicker,null);
 36                 //获取datepicker和timepicker,在这里要注意.
 37                 //如果是直接通过datepicker = (DatePicker) findViewById(R.id.myDatePicker);或者
 38                 //datepicker = (DatePicker) this.findViewById(R.id.myDatePicker);来获取控件
 39                 //会出现空指针异常,因为当前的this指的是MyTouchListener的实例。所以在这里通过view来取得控件
 40                 final DatePicker datepicker = (DatePicker) view.findViewById(R.id.myDatePicker);
 41                 final TimePicker timepicker = (TimePicker) view.findViewById(R.id.myTimePicker);
 42                 //设置对话框的布局文件
 43                 builder.setView(view);
 44                 //获取Calendar实例来初始化datepicker和设置timepicker的初始值
 45                 Calendar cal = Calendar.getInstance();
 46                 cal.setTimeInMillis(System.currentTimeMillis());
 47                 datepicker.init(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
 48                         cal.get(Calendar.DAY_OF_MONTH), null);
 49                 timepicker.setIs24HourView(true);
 50                 timepicker.setCurrentHour(cal.get(Calendar.HOUR_OF_DAY));
 51                 timepicker.setCurrentMinute(cal.get(Calendar.MINUTE));
 52                 //判断事件的对象
 53                 if(v.getId() == R.id.startEditText){
 54                     final int inType = startEdit.getInputType();
 55                     startEdit.setInputType(InputType.TYPE_NULL);
 56                     startEdit.onTouchEvent(event);
 57                     startEdit.setInputType(inType);
 58                     //设置对话框属性
 59                     builder.setTitle(R.string.starttitle);
 60                     builder.setPositiveButton("确 定", new DialogInterface.OnClickListener()
 61                     {
 62
 63                         @Override
 64                         public void onClick(DialogInterface dialog, int which) {
 65                             // TODO Auto-generated method stub
 66                             StringBuffer sb = new StringBuffer();
 67                             sb.append(String.format("%d-%02d-%02d",
 68                                     datepicker.getYear(),
 69                                     datepicker.getMonth()+1,
 70                                     datepicker.getDayOfMonth()));
 71                             sb.append("  ");
 72                             sb.append(timepicker.getCurrentHour())
 73                             .append(":")
 74                             .append(timepicker.getCurrentMinute());
 75                             startEdit.setText(sb);
 76                             dialog.cancel();
 77                         }
 78                     }
 79                     );
 80                 }
 81                 if(v.getId() == R.id.endEditText){
 82                     final int inType = endEdit.getInputType();
 83                     endEdit.setInputType(InputType.TYPE_NULL);
 84                     endEdit.onTouchEvent(event);
 85                     endEdit.setInputType(inType);
 86                     //设置对话框属性
 87                     builder.setTitle(R.string.endtitle);
 88                     builder.setPositiveButton("确 定", new DialogInterface.OnClickListener()
 89                     {
 90
 91                         @Override
 92                         public void onClick(DialogInterface dialog, int which) {
 93                             // TODO Auto-generated method stub
 94                             StringBuffer sb = new StringBuffer();
 95                             sb.append(String.format("%d-%02d-%02d",
 96                                     datepicker.getYear(),
 97                                     datepicker.getMonth() + 1,
 98                                     datepicker.getDayOfMonth()));
 99                             sb.append("  ");
100                             sb.append(timepicker.getCurrentHour())
101                             .append(":").append(timepicker.getCurrentMinute());
102                             endEdit.setText(sb);
103                             dialog.cancel();
104                         }
105                     }
106                     );
107                 }
108                 //创建对话框,并显示
109                 AlertDialog dialog = builder.create();
110                 dialog.show();
111             }
112             return true;
113         }
114
115     }
116     @Override
117     public boolean onCreateOptionsMenu(Menu menu) {
118         // Inflate the menu; this adds items to the action bar if it is present.
119         getMenuInflater().inflate(R.menu.main, menu);
120         return true;
121     }
122
123 }

接下来运行程序:发现界面丑的简直不能忍啊。

  连时间都看不到,让我怎么选。上面那个日历也是大的可以。既然涉及到外观那么说不定在XML文件里能找到些许的影子。抱着试一试的想法去XML文件中找,但是看了那茫茫多的属性就在想这么找何时才能找到。想到android通常在XML中出现的属性,就会有相似的set和get方法。于是乎,直接看SDK文档,找到set开头的那些函数。果然很快就定位在setCalendarViewShown上。看了一下的介绍感觉八九不离十,实验才是检验真理的标准。于是乎在程序中添加一行代码

1 //获取Calendar实例来初始化datepicker和设置timepicker的初始值
2                 Calendar cal = Calendar.getInstance();
3                 cal.setTimeInMillis(System.currentTimeMillis());
4                 datepicker.setCalendarViewShown(false);
5                 datepicker.init(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH),
6                         cal.get(Calendar.DAY_OF_MONTH), null);

  运行一下程序,果然。界面瞬间不一样。

  然后试验一下发现程序和我们想的一样正常工作。但是到这里就完了吗?反过来想想既然有set方法去设置,那么会不会有这个属性呢,我们再一次来到XML文件,这一次有了目标。属性可能是带CalendarViewShown这类字样的,很快我们发现确实有这个属性。立马尝试了一下,将它设为false,并删掉之前的那一句代码。程序依然正常运行。所以这个属性是正确的。好像到这里就该去睡觉了,但是细心的人已经发现在上面的代码中有一个地方有点怪,我们看到这个getMonth()在返回后还加了1,那么我们把这个加1去掉呢,再次运行程序发现,显示的月份总比选择的月份小1,天天和程序打交道的话就会立即反应一下:"难道月份也是从0计数的?",还是老套路,碰到怪问题就去问SDK,但是发现getmonth这个函数的解释只有一句话,返回选择的月,于是我们望上看,突然发现了Calendar的常量字段。发现果然是从0开始:

public static final int JANUARY

Added in API level 1
Value of the MONTH field indicating the first month of the year.

Constant Value: 0 (0x00000000)。那么既然是这样,反过来我们去设置月份的时候也一样,当我们通过函数这是对应参数为8的时候其实是9.所以要注意程序在参数的处理。今天就写到这儿吧,该睡觉了。

  

1 sb.append(String.format("%d-%02d-%02d",
2                                     datepicker.getYear(),
3                                     datepicker.getMonth()+1,
4                                     datepicker.getDayOfMonth()));
时间: 2024-10-05 18:26:57

Android UI组件之DatePicker,TimePicker的相关文章

Android UI组件进阶(2)——仿Windows对话框

Android UI组件进阶(2)--仿Windows对话框 在开始本章前先祝大家中秋节快乐哈,相信很多上班的朋友都是放三天假的哈! 有时间的话回家陪陪父母吧!树欲静而风不止,子欲养而亲不待!岁月不饶人! 好了,道理和祝福语就说到这里了,今天给大家准备的是模仿Windows风格对话框! 效果图: 相信大部分的AlertDialog都是下面这个样子的: 今天给大家讲解的对话框是下面这样的: 对比两种对话框,站在用户的角度,相信你更加钟情于第二种颜色鲜明的对话框 好了下面就开始讲解如何制作模仿win

Android UI组件之EditText 实现网站注册效果的校验

时间过得太快,还没有什么感觉就到周末了,人生五十载,如梦亦如幻.不过我还没那么老.前两天曾说过,如果需要实现输入IP的功能,那么我们可以整一个自定义控件,然后对他进行事件监听,巴拉巴拉一大堆,好不容易做完了.后来想想,这是为了符合我们平常在PC上的习惯而去自定义的.那么如果只是单纯的为了输入一个IP地址,然后得到结果,不想去这么折腾,有没有什么好办法呢? 很显然是有的,那就今天就来看看Android最常用的组件之一的EditText,虽然之前用的也是EditText,但是侧重点其实是自定义控件,

Android 高级UI设计笔记08:Android开发者常用的7款Android UI组件(转载)

Android开发是目前最热门的移动开发技术之一,随着开发者的不断努力和Android社区的进步,Android开发技术已经日趋成熟,当然,在Android开源社区中也涌现了很多不错的开源UI项目,它们可以帮助Android开发者更方便快捷地完成想要的功能.本文是Android系列的第一篇,主要是向大家推荐一些常用的Android UI组件,它们都是开源的. 1.图表引擎 -  AChartEngine AChartEngine是一款基于Android的图表绘制引擎,它为Android开发者提供

Android UI 组件 &#187; GifView

GifView 是一个为了解决android中现在没有直接显示gif的view,只能通过mediaplay来显示这个问题的项目,其用法和 ImageView一样,支持gif图片 使用方法: 1-把GifView.jar加入你的项目. 2-在xml中配置GifView的基本属性,GifView继承自View类,和Button.ImageView一样是一个UI控件.如: <com.ant.liao.GifView android:id="@+id/gif2" android:layo

7款Android开发者常用的Android UI组件

7款Android开发者常用的Android UI组件 原文  http://news.cnblogs.com/n/506366/ Android 开发是目前最热门的移动开发技术之一,随着开发者的不断努力和 Android 社区的进步,Android 开发技术已经日趋成熟,当然,在 Android 开源社区中也涌现了很多不错的开源 UI 项目,它们可以帮助 Android 开发者更方便快捷地完成想要的功能.本文是 Android 系列的第一篇,主要是向大家推荐一些常用的 Android UI 组

Android UI组件----自定义ListView实现动态刷新

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3910541.html 联系方式:[email protected] [正文] 一.具体步骤: (1)在activiy_main.xml中加一个ListView控件:再添加一个item的模板activity_main_item.xml,加一个底部加载的视图activity_main_load.xml

Android UI组件进阶(1)——带进度条的按钮

Android UI组件进阶(1)--带进度条的按钮 本节引言: 这个系列是继Android UI组件实例大全后的进阶系列,在该系列中我们将进一步的学习 Android UI组件,建议阅读本系列前线学习下UI组件实例大全系列,掌握基本组件的使用; 当然你也可以直接学习本系列!好了,废话不多说,直接开始第一节吧!本节要演示的是: 带进度条的按钮!相信大家在360手机助手到看到这个东东吧: 本节要实现的就是下方这个点击后显示进度的按钮 效果图: 必备基础: 1.进度条的一些属性: backgroun

android常用组件之DatePicker和TimePicker

在android中,DatePicker组件和TimePicker组件分别是日期选择器和时间选择器. 该实例中,当点击日期选择器按钮后,弹出日期选择框,用户选择日期后andoid会将日期显示到TextView组件中:当点击时间选择器按钮后,弹出时间选择框,选择后在相应的TextView组件显示时间. 日期选择框和时间选择框在创建实例的过程中,构造方法的参数类似,以下分别介绍: 1.日期选择框创建实例如下 DatePickerDialog datePicker=new DatePickerDial

Android UI组件之自定义控件实现IP地址控件

趁着时间挺充裕,就多写几篇博客.每一篇都是学习中的教训.今天在做东西的时候突然想到之前在MFC的时候都会有一个IP地址控件,可能是PC端用的比较多,但是在移动端好像基本没什么用处,但是偶尔也会有项目要用到,毕竟还是有些项目不需要接入互联网,只需要接入企业的内部网络.这个时候为了程序的通用性,我想到的第一个就是在程序中去配置一个网络环境,并将它保存到本地中,这样以后程序每次加载直接去本地中获取值.既然没有已有的控件,那么久自定义好了.存储在本地首先想到的就是sqlite和SharedPrefere