Android之日期時(shí)間選擇控件DatePicker和TimePicker實(shí)例
這個(gè)月根據(jù)需求在項(xiàng)目中做了一個(gè)時(shí)間選擇器,雖然沒(méi)有用到Android原生的時(shí)間選擇控件,但我羞愧地發(fā)現(xiàn)自己竟然從來(lái)沒(méi)有用過(guò)這方面控件!趁現(xiàn)在有時(shí)間,趕緊查缺補(bǔ)漏,寫(xiě)一篇博客吧。
(注:為了便于區(qū)分,本文將選擇年月日的控件稱為日期選擇控件,將選擇時(shí)分的控件稱為時(shí)間選擇控件。)
1、創(chuàng)建項(xiàng)目
新建一個(gè)項(xiàng)目,MainActivity的布局如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp"
tools:context="com.lindroid.datetimepickerdemo.MainActivity">
<LinearLayout
android:id="@+id/ll_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="選擇日期:"
android:textSize="18sp" />
<TextView
android:id="@+id/tv_date"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ededed"
android:padding="8dp"
android:textSize="18sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="選擇時(shí)間:"
android:textSize="18sp" />
<TextView
android:id="@+id/tv_time"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ededed"
android:padding="8dp"
android:textSize="18sp" />
</LinearLayout>
</LinearLayout>
界面效果如下:

點(diǎn)擊條目之后就會(huì)彈出日期或者時(shí)間選擇控件,點(diǎn)擊確定按鈕后,就會(huì)將選擇的結(jié)果顯示在淺灰色的方框中。
2、初始化控件和創(chuàng)建相關(guān)變量
2.1 初始化控件
初始化控件,并為兩個(gè)LinearLayout設(shè)置監(jiān)聽(tīng)事件:
private void initView() {
llDate = (LinearLayout) findViewById(R.id.ll_date);
tvDate = (TextView) findViewById(R.id.tv_date);
llTime = (LinearLayout) findViewById(R.id.ll_time);
tvTime = (TextView) findViewById(R.id.tv_time);
llDate.setOnClickListener(this);
llTime.setOnClickListener(this);
}
2.2 創(chuàng)建相關(guān)變量
使用Calendar類獲取當(dāng)前的日期時(shí)間。
private int year, month, day, hour, minute;
private void initDateTime() {
Calendar calendar = Calendar.getInstance();
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH) + 1;
day = calendar.get(Calendar.DAY_OF_MONTH);
hour = calendar.get(Calendar.HOUR);
minute = calendar.get(Calendar.MINUTE);
}
注意,calendar.get(Calendar.MONTH)獲取到的月份下標(biāo)是從0開(kāi)始的,值為0時(shí)表示一月份,1時(shí)表示二月份,以此類推,所以必須加上1。
創(chuàng)建兩個(gè)StringBuffer變量,用于拼接獲取到的時(shí)間數(shù)據(jù)。
private StringBuffer date, time;
3、日期選擇控件DatePicker
這里我們選擇自定義AlertDialog的形式來(lái)顯示選擇控件。
日期選擇控件自定義布局dialog_date.xml如下:
<?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="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical">
<DatePicker
android:id="@+id/datePicker"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:calendarViewShown="false"
android:endYear="2027"
android:startYear="2007" />
</LinearLayout>
只需放置一個(gè)DatePicker控件即可。不同版本的Android的DatePicker控件外觀可能有所不同,比如Android4.4上是滾輪的形式,在7.0上則是一個(gè)日歷視圖。為了避免在4.4等低版本上顯示出日歷視圖占用太多空間,可以將android:calendarViewShown屬性設(shè)為fasle。
繼承接口DatePicker.OnDateChangedListener,實(shí)現(xiàn)日期改變的監(jiān)聽(tīng)方法:
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
this.year = year;
this.month = monthOfYear;
this.day = dayOfMonth;
}
這樣就可以獲取到用戶選擇的年月日數(shù)值了。下面就是創(chuàng)建AlertDialog了:
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setPositiveButton("設(shè)置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (date.length() > 0) { //清除上次記錄的日期
date.delete(0, date.length());
}
tvDate.setText(date.append(String.valueOf(year)).append("年").append(String.valueOf(month)).append("月").append(day).append("日"));
dialog.dismiss();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
final AlertDialog dialog = builder.create();
View dialogView = View.inflate(context, R.layout.dialog_date, null);
final DatePicker datePicker = (DatePicker) dialogView.findViewById(R.id.datePicker);
dialog.setTitle("設(shè)置日期");
dialog.setView(dialogView);
dialog.show();
//初始化日期監(jiān)聽(tīng)事件
datePicker.init(year, month - 1, day, this);
DatePicker需要調(diào)用init方法初始化,傳入年月日數(shù)值和OnDateChangedListener對(duì)象。要記住我們前面在給month賦值時(shí)已經(jīng)是對(duì)應(yīng)的月份數(shù)值了,而這里需要的是下標(biāo)值,所以要減1。
運(yùn)行之后,效果如圖所示:

4、時(shí)間選擇控件TimePicker
這里我們同樣需要一個(gè)自定義的AlertDialog布局:
<?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="wrap_content"
android:gravity="center"
android:orientation="vertical">
<TimePicker
android:id="@+id/timePicker"
android:layout_width="match_parent"
android:layout_height="wrap_content"></TimePicker>
</LinearLayout>
同樣,我們需要監(jiān)聽(tīng)時(shí)和分的變化,所以繼承TimePicker.OnTimeChangedListener接口,實(shí)現(xiàn)以下的方法:
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
this.hour = hourOfDay;
this.minute = minute;
}
時(shí)間選擇控件的初始化跟日期選擇控件的有所不同,DatePicker一個(gè)init方法解決,但TimePicker的工作量稍大一點(diǎn)??聪旅娲a:
timePicker.setCurrentHour(hour);
timePicker.setCurrentMinute(minute);
timePicker.setIs24HourView(true); //設(shè)置24小時(shí)制
timePicker.setOnTimeChangedListener(this);
除了要設(shè)置當(dāng)前要顯示的時(shí)和分之外,還要設(shè)置是24小時(shí)制還是12小時(shí)制。
效果圖如下:

5、完整的MainActivity代碼
package com.lindroid.datetimepickerdemo;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.DatePicker;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.TimePicker;
import java.util.Calendar;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, DatePicker.OnDateChangedListener, TimePicker.OnTimeChangedListener {
private Context context;
private LinearLayout llDate, llTime;
private TextView tvDate, tvTime;
private int year, month, day, hour, minute;
//在TextView上顯示的字符
private StringBuffer date, time;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = this;
date = new StringBuffer();
time = new StringBuffer();
initView();
initDateTime();
}
/**
* 初始化控件
*/
private void initView() {
llDate = (LinearLayout) findViewById(R.id.ll_date);
tvDate = (TextView) findViewById(R.id.tv_date);
llTime = (LinearLayout) findViewById(R.id.ll_time);
tvTime = (TextView) findViewById(R.id.tv_time);
llDate.setOnClickListener(this);
llTime.setOnClickListener(this);
}
/**
* 獲取當(dāng)前的日期和時(shí)間
*/
private void initDateTime() {
Calendar calendar = Calendar.getInstance();
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH) + 1;
day = calendar.get(Calendar.DAY_OF_MONTH);
hour = calendar.get(Calendar.HOUR);
minute = calendar.get(Calendar.MINUTE);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.ll_date:
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setPositiveButton("設(shè)置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (date.length() > 0) { //清除上次記錄的日期
date.delete(0, date.length());
}
tvDate.setText(date.append(String.valueOf(year)).append("年").append(String.valueOf(month)).append("月").append(day).append("日"));
dialog.dismiss();
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
final AlertDialog dialog = builder.create();
View dialogView = View.inflate(context, R.layout.dialog_date, null);
final DatePicker datePicker = (DatePicker) dialogView.findViewById(R.id.datePicker);
dialog.setTitle("設(shè)置日期");
dialog.setView(dialogView);
dialog.show();
//初始化日期監(jiān)聽(tīng)事件
datePicker.init(year, month - 1, day, this);
break;
case R.id.ll_time:
AlertDialog.Builder builder2 = new AlertDialog.Builder(context);
builder2.setPositiveButton("設(shè)置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (time.length() > 0) { //清除上次記錄的日期
time.delete(0, time.length());
}
tvTime.setText(time.append(String.valueOf(hour)).append("時(shí)").append(String.valueOf(minute)).append("分"));
dialog.dismiss();
}
});
builder2.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
AlertDialog dialog2 = builder2.create();
View dialogView2 = View.inflate(context, R.layout.dialog_time, null);
TimePicker timePicker = (TimePicker) dialogView2.findViewById(R.id.timePicker);
timePicker.setCurrentHour(hour);
timePicker.setCurrentMinute(minute);
timePicker.setIs24HourView(true); //設(shè)置24小時(shí)制
timePicker.setOnTimeChangedListener(this);
dialog2.setTitle("設(shè)置時(shí)間");
dialog2.setView(dialogView2);
dialog2.show();
break;
}
}
/**
* 日期改變的監(jiān)聽(tīng)事件
*
* @param view
* @param year
* @param monthOfYear
* @param dayOfMonth
*/
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
this.year = year;
this.month = monthOfYear;
this.day = dayOfMonth;
}
/**
* 時(shí)間改變的監(jiān)聽(tīng)事件
*
* @param view
* @param hourOfDay
* @param minute
*/
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
this.hour = hourOfDay;
this.minute = minute;
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實(shí)現(xiàn)選項(xiàng)菜單子菜單
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)選項(xiàng)菜單子菜單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
Android編程使WebView支持HTML5 Video全屏播放的解決方法
這篇文章主要介紹了Android編程使WebView支持HTML5 Video全屏播放的解決方法,較為詳細(xì)的分析了全屏播放所涉及的相關(guān)技巧,并給出了完整代碼下載地址供讀者參考,需要的朋友可以參考下2015-10-10
自己實(shí)現(xiàn)的android樹(shù)控件treeview
在項(xiàng)目中經(jīng)常需要一個(gè)需要一個(gè)樹(shù)狀框架,因?yàn)橐恍┰驔](méi)有使用系統(tǒng)自帶的控件,所以就自己寫(xiě)了一個(gè),現(xiàn)在分享給大家2014-01-01
深入解析Android App的LayoutInflate布局
這篇文章主要介紹了Android App的LayoutInflate布局,對(duì)LayoutInflate編寫(xiě)中經(jīng)常被無(wú)解及產(chǎn)生錯(cuò)誤的地方進(jìn)行了深入說(shuō)明,需要的朋友可以參考下2016-04-04
Android 自定義標(biāo)題欄的實(shí)例詳解
這篇文章主要介紹了 Android 自定義標(biāo)題欄的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家實(shí)現(xiàn)這樣類似的功能,需要的朋友可以參考下2017-10-10
Android開(kāi)發(fā)筆記之:用Enum(枚舉類型)取代整數(shù)集的應(yīng)用詳解
本篇文章是對(duì)Android中用Enum(枚舉類型)取代整數(shù)集的應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05

