API Demos 2.3 学习笔记 (11)-- Views->Date Widgets

简介:

更多精彩内容,请点击阅读:《API Demos 2.3 学习笔记》


Date Widgets大致可以分为两类,一类是弹出对话框类型的控件,包括DatePickerDialog(日期选择对话框控件)和TimePickerDialog(时间选择对话框控件);另一类就是内嵌类型的控件,包括DatePicker(日期选择窗口控件)和TimePicker(时间选择窗口控件)。这些控件广泛应用在需要选择和记录时间信息的场合,例如:谷歌日历。
下面我们简单介绍下这四种控件的调用方法:

1、DatePickerDialog

// 日期和时间相关定义数据
	private int mYear;
	private int mMonth;
	private int mDay;
	private int mHour;
	private int mMinute;

	// 通过java类Calendar获得系统当前时间数据信息
	final Calendar c = Calendar.getInstance();
	mYear = c.get(Calendar.YEAR);
	mMonth = c.get(Calendar.MONTH);
	mDay = c.get(Calendar.DAY_OF_MONTH);
	mHour = c.get(Calendar.HOUR_OF_DAY);
	mMinute = c.get(Calendar.MINUTE);

	// 创建日期选择对话框
      DatePickerDialog mDatePickerDialog = new DatePickerDialog(this,
        		new DatePickerDialog.OnDateSetListener() {
					
		public void onDateSet(DatePicker view, int year, int monthOfYear,
							int dayOfMonth) {
						mYear = year;
						mMonth = monthOfYear;
						mDay = dayOfMonth;		
		    				/*这里放更新日期的方法*/			
					}
				}, mYear, mMonth, mDay);
   mDatePickerDialog.show();
注:创建 DatePickerDialog时,5个参数以及它们对应的含义如下:
context: 对话框的上下文环境context
callBack: 对话框监听器 DatePickerDialog.OnDateSetListener
Year: 对话框创建时显示的初始年份
MonthOfYear:对话框创建时显示的初始月份
DayOfMonth:对话框创建时显示的初始日期

2、TimePickerDialog

// 日期和时间相关定义数据
	private int mYear;
	private int mMonth;
	private int mDay;
	private int mHour;
	private int mMinute;

	// 通过java类Calendar获得系统当前时间数据信息
	final Calendar c = Calendar.getInstance();
	mYear = c.get(Calendar.YEAR);
	mMonth = c.get(Calendar.MONTH);
	mDay = c.get(Calendar.DAY_OF_MONTH);
	mHour = c.get(Calendar.HOUR_OF_DAY);
	mMinute = c.get(Calendar.MINUTE);

	// 创建时间选择对话框
       TimePickerDialog mTimePickerDialog =  new TimePickerDialog(this,
        		new TimePickerDialog.OnTimeSetListener() {
					
		 public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
		    			mHour = hourOfDay;
		    			mMinute = minute;
		    			/*这里放更新时间的方法*/
		    		}
			}, mHour, mMinute,true);
       mTimePickerDialog.show();
注: 创建 TimePickerDialog时,5个参数以及它们对应的含义如下:
context: 对话框的上下文环境context
callBack: 对话框监听器TimePickerDialog.OnTimeSetListener
hourOfDay: 对话框创建时显示的初始小时
minute:对话框创建时显示的初始分钟
is24HourView: 是否显示24小时制视图。true则显示,否则显示12小时制视图


3DatePicker

	// 日期和时间相关定义数据
	private int mYear;
	private int mMonth;
	private int mDay;
	private int mHour;
	private int mMinute;


	// 通过java类Calendar获得系统当前时间数据信息
	final Calendar c = Calendar.getInstance();
	mYear = c.get(Calendar.YEAR);
	mMonth = c.get(Calendar.MONTH);
	mDay = c.get(Calendar.DAY_OF_MONTH);
	mHour = c.get(Calendar.HOUR_OF_DAY);
	mMinute = c.get(Calendar.MINUTE);

	// 通过findViewById方法获得一个DatePicker对象	
	DatePicker datePicker = (DatePicker) findViewById(R.id.datePicker);
	datePicker.init(mYear, mMonth, mDay, new DatePicker.OnDateChangedListener(){

			public void onDateChanged(DatePicker view, int year, int monthOfYear,
					int dayOfMonth) {
				mYear = year;
				mMonth = monthOfYear;
				mDay = dayOfMonth;
    			/*这里放更新日期的方法*/		
			}       
	});

注:创建 DatePicker 时,需要注意的是,使用的是方法是init(),这与其他三个控件创建方法不一样,切忌混淆。4个参数以及它们对应的含义如下:
Year:   DatePicker 创建时显示的初始年份
MonthOfYear:  DatePicker 创建时显示的初始月份
DayOfMonth:  DatePicker 创建时显示的初始日期
callBack:   监听器  DatePicker.OnDateChangedListener


4、TimePicker

// 日期和时间相关定义数据
	private int mYear;
	private int mMonth;
	private int mDay;
	private int mHour;
	private int mMinute;

	// 通过java类Calendar获得系统当前时间数据信息
	final Calendar c = Calendar.getInstance();
	mYear = c.get(Calendar.YEAR);
	mMonth = c.get(Calendar.MONTH);
	mDay = c.get(Calendar.DAY_OF_MONTH);
	mHour = c.get(Calendar.HOUR_OF_DAY);
	mMinute = c.get(Calendar.MINUTE);


	// 通过findViewById方法获得一个TimePicker对象
	TimePicker timePicker = (TimePicker) findViewById(R.id.timePicker);
	timePicker.setIs24HourView(true); //参数is24HourView,如果是true,则为24小时制,否则,则为12小时制。
	timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {

			public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
				mHour = hourOfDay;
				mMinute = minute;
				/*这里放更新时间的方法*/
			}
	});

下面我们进行实例代码解析:
实例一:DateWidgets1
res-value-string.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="date_widgets_example_dateDisplay_text"></string>
    <string name="date_widgets_example_pickTime_text">change the time</string>
    <string name="date_widgets_example_pickDate_text">change the date</string>
</resources>

res-layout-date_widgets_example_1.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">
	
	<!-- 日期和时间显示区 -->
    <LinearLayout android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        <TextView android:id="@+id/dateDisplay"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/date_widgets_example_dateDisplay_text"/>
    </LinearLayout>

	<!-- 按钮一,点击弹出日期选择对话框 -->
    <Button android:id="@+id/pickDate"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/date_widgets_example_pickDate_text"/>
            
	<!-- 按钮二,点击弹出时间选择对话框 -->
    <Button android:id="@+id/pickTime"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/date_widgets_example_pickTime_text"/>

</LinearLayout>

src-com.example.android.apis.view-DateWidgets1.java

package com.example.android.apis.view;

import com.example.android.apis.R;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.app.Dialog;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TimePicker;
import android.view.View;

import java.util.Calendar;

public class DateWidgets1 extends Activity {

	// 日期和时间显示区域
	private TextView mDateDisplay;

	// 日期和时间相关定义数据
	private int mYear;
	private int mMonth;
	private int mDay;
	private int mHour;
	private int mMinute;

	// 对话框标示,用于创建对话框时进行区分
	static final int TIME_DIALOG_ID = 0;
	static final int DATE_DIALOG_ID = 1;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.date_widgets_example_1);

		// 通过findViewById方法获得一个TextView对象
		mDateDisplay = (TextView) findViewById(R.id.dateDisplay);

		// 通过findViewById方法获得一个Button对象:pickDate,并设置监听器。
		Button pickDate = (Button) findViewById(R.id.pickDate);
		pickDate.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				showDialog(DATE_DIALOG_ID); // 点击按钮时,触发响应,创建或者显示日期选择对话框
			}
		});

		// 通过findViewById方法获得一个Button对象:pickTime,并设置监听器。
		Button pickTime = (Button) findViewById(R.id.pickTime);
		pickTime.setOnClickListener(new View.OnClickListener() {

			public void onClick(View v) {
				showDialog(TIME_DIALOG_ID); // 点击按钮时,触发响应,创建或者显示时间选择对话框
			}
		});

		// 通过java类Calendar获得系统当前时间数据信息,并更新显示在TextView上
		final Calendar c = Calendar.getInstance();
		mYear = c.get(Calendar.YEAR);
		mMonth = c.get(Calendar.MONTH);
		mDay = c.get(Calendar.DAY_OF_MONTH);
		mHour = c.get(Calendar.HOUR_OF_DAY);
		mMinute = c.get(Calendar.MINUTE);
		updateDisplay();
	}

	// 根据对话框标识创建对话框
	@Override
	protected Dialog onCreateDialog(int id) {
		switch (id) {
		case TIME_DIALOG_ID:
			// 创建时间选择对话框 最后一个参数is24HourView,如果是true,则为24小时制,否则,则为12小时制。
			return new TimePickerDialog(this, mTimeSetListener, mHour, mMinute,
					true);
		case DATE_DIALOG_ID:
			// 创建日期选择对话框
			return new DatePickerDialog(this, mDateSetListener, mYear, mMonth,
					mDay);
		}
		return null;
	}

	// 根据对话框标识更新对话框
	@Override
	protected void onPrepareDialog(int id, Dialog dialog) {
		switch (id) {
		case TIME_DIALOG_ID:
			// 更新时间选择对话框信息
			((TimePickerDialog) dialog).updateTime(mHour, mMinute);
			break;
		case DATE_DIALOG_ID:
			// 更新日期选择对话框信息
			((DatePickerDialog) dialog).updateDate(mYear, mMonth, mDay);
			break;
		}
	}

	// 更新日期和时间显示区的信息
	private void updateDisplay() {
		mDateDisplay.setText(new StringBuilder()
		// 由于月份是按照从0到11进行计算,因此显示的时候加上1,进行转换。
		.append(mMonth + 1).append("-").append(mDay).append("-")
		.append(mYear).append(" ").append(pad(mHour)).append(":")
		.append(pad(mMinute)));
	}

	// 理论上可以修改系统时间,但由于系统限制,缺乏root权限,实际上这个函数并不能真正去修改系统时间。
	private void updateSystemTime() {
		final Calendar c = Calendar.getInstance();
		// 由于月份是按照从0到11进行计算,因此设置的时候减去1,进行转换。
		c.set(mYear, mMonth - 1, mDay, mHour, mMinute);
	}

	// 日期设置监听器,当改变日期时,更新时间显示信息
	private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {

		public void onDateSet(DatePicker view, int year, int monthOfYear,
				int dayOfMonth) {
			mYear = year;
			mMonth = monthOfYear;
			mDay = dayOfMonth;
			updateSystemTime();
			updateDisplay();
		}
	};

	// 时间设置监听器,当改变时间时,更新时间显示信息
	private TimePickerDialog.OnTimeSetListener mTimeSetListener = new TimePickerDialog.OnTimeSetListener() {

		public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
			mHour = hourOfDay;
			mMinute = minute;
			updateSystemTime();
			updateDisplay();
		}
	};

	// 当小时或者分钟为个位数字时,前面加一个0
	private static String pad(int c) {
		if (c >= 10)
			return String.valueOf(c);
		else
			return "0" + String.valueOf(c);
	}
}

实例二:DateWidgets2
res-value-string.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="date_widgets_example_dateDisplay_text"></string>
    <string name="date_widgets_example_pickTime_text">change the time</string>
    <string name="date_widgets_example_pickDate_text">change the date</string>
</resources>

res-layout-date_widgets_example_2.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">
	
	 <!-- 内嵌日期选择控件 -->
    <DatePicker android:id="@+id/datePicker"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"/>
      
     <!-- 内嵌时间选择控件 -->  
    <TimePicker android:id="@+id/timePicker"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"/>
	 
	 <!-- 日期和时间显示区 -->
    <TextView android:id="@+id/dateDisplay"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"            
            android:paddingLeft="4dip"
            android:text="@string/date_widgets_example_dateDisplay_text"/>
</LinearLayout>

src-com.example.android.apis.view-DateWidgets2.java

package com.example.android.apis.view;

import java.util.Calendar;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.DatePicker;

import com.example.android.apis.R;

public class DateWidgets2 extends Activity {

	// 日期和时间显示区域
	private TextView mTimeDisplay;

	// 日期和时间相关定义数据
	private int mYear;
	private int mMonth;
	private int mDay;
	private int mHour;
	private int mMinute;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		setContentView(R.layout.date_widgets_example_2);

		// 通过findViewById方法获得一个TextView对象,用作日期和时间显示区      
		mTimeDisplay = (TextView) findViewById(R.id.dateDisplay);

		// 通过java类Calendar获得系统当前时间数据信息,并更新显示在TextView上
		final Calendar c = Calendar.getInstance();
		mYear = c.get(Calendar.YEAR);
		mMonth = c.get(Calendar.MONTH);
		mDay = c.get(Calendar.DAY_OF_MONTH);
		mHour = c.get(Calendar.HOUR_OF_DAY);
		mMinute = c.get(Calendar.MINUTE);
		updateDisplay();

		// 通过findViewById方法获得一个DatePicker对象
		DatePicker datePicker = (DatePicker) findViewById(R.id.datePicker);
		datePicker.init(mYear, mMonth, mDay, new DatePicker.OnDateChangedListener(){

			public void onDateChanged(DatePicker view, int year, int monthOfYear,
					int dayOfMonth) {
				mYear = year;
				mMonth = monthOfYear;
				mDay = dayOfMonth;
				updateSystemTime();
				updateDisplay();				
			}       
		});

		// 通过findViewById方法获得一个TimePicker对象
		TimePicker timePicker = (TimePicker) findViewById(R.id.timePicker);
		timePicker.setIs24HourView(true); //参数is24HourView,如果是true,则为24小时制,否则,则为12小时制。
		timePicker.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {

			public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
				mHour = hourOfDay;
				mMinute = minute;
				updateSystemTime();
				updateDisplay();
			}
		});

	}

	// 更新日期和时间显示区的信息
	private void updateDisplay() {
		mTimeDisplay.setText(new StringBuilder()
		// 由于月份是按照从0到11进行计算,因此显示的时候加上1,进行转换。
		.append(mMonth + 1).append("-").append(mDay).append("-")
		.append(mYear).append(" ").append(pad(mHour)).append(":")
		.append(pad(mMinute)));
	}

	// 理论上可以修改系统时间,但由于系统限制,缺乏root权限,实际上这个函数并不能真正去修改系统时间。
	private void updateSystemTime() {
		final Calendar c = Calendar.getInstance();
		// 由于月份是按照从0到11进行计算,因此设置的时候减去1,进行转换。
		c.set(mYear, mMonth - 1, mDay, mHour, mMinute);
	}

	// 当小时或者分钟为个位数字时,前面加一个0	
	private static String pad(int c) {
		if (c >= 10)
			return String.valueOf(c);
		else
			return "0" + String.valueOf(c);
	}

}

知识点1:如何修改系统时间?
最初我以为android下修改系统时间是一件很容易的事情,但是后来,我发现我错了。为了系统安全起见,一般情况下,android是禁止应用程序修改系统时间的。不过,通过应用程序来修改系统时间也不是不可能的。如果你对此有兴趣的话,请点击阅读: 《Android中如何修改系统时间》


知识点2:Android Dialog之showDialog(int id)
关于android下Dialog创建以及使用等,以下文章讲的非常详细,建议点击阅读: 《android 之 Dialog》


预览效果:

                  

相关文章
|
7月前
|
Java API
Java常用API(三)Date,DateFormat和Calendar
Java常用API(三)Date,DateFormat和Calendar
44 0
|
8月前
|
前端开发 API
前端学习笔记202305学习笔记第三十天-什么是mvc-c层api 前后端联动1
前端学习笔记202305学习笔记第三十天-什么是mvc-c层api 前后端联动1
51 0
|
8月前
|
前端开发 API
前端学习笔记202305学习笔记第三十一天-什么是mvc-c层api 前后端联动3
前端学习笔记202305学习笔记第三十一天-什么是mvc-c层api 前后端联动3
41 0
|
8月前
|
前端开发 API
前端学习笔记202305学习笔记第三十一天-什么是mvc-c层api 和mvc总结3
前端学习笔记202305学习笔记第三十一天-什么是mvc-c层api 和mvc总结3
32 0
|
8月前
|
前端开发 API
前端学习笔记202305学习笔记第三十一天-什么是mvc-c层api 和mvc总结4
前端学习笔记202305学习笔记第三十一天-什么是mvc-c层api 和mvc总结
43 0
|
8月前
|
前端开发 API
前端学习笔记202305学习笔记第三十天-什么是mvc-c层api 前后端联动3
前端学习笔记202305学习笔记第三十天-什么是mvc-c层api 前后端联动3
47 0
|
8月前
|
前端开发 API
前端学习笔记202305学习笔记第三十一天-什么是mvc-c层api 和mvc总结2
前端学习笔记202305学习笔记第三十一天-什么是mvc-c层api 和mvc总结2
40 0
|
8月前
|
前端开发 API
前端学习笔记202305学习笔记第二十二天-新增修改api的封装
前端学习笔记202305学习笔记第二十二天-新增修改api的封装2
34 0
|
8月前
|
前端开发 API
前端学习笔记202305学习笔记第三十天-什么是mvc-c层api 前后端联动2
前端学习笔记202305学习笔记第三十天-什么是mvc-c层api 前后端联动2
41 0
|
8月前
|
前端开发 API
前端学习笔记202305学习笔记第二十二天-新增修改api的封装2
前端学习笔记202305学习笔记第二十二天-新增修改api的封装2
41 0
前端学习笔记202305学习笔记第二十二天-新增修改api的封装2