閱讀574 返回首頁    go 汽車大全


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:andro
    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:
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/date_widgets_example_dateDisplay_text"/>
    </LinearLayout>

	<!-- 按鈕一,點擊彈出日期選擇對話框 -->
    <Button android:
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/date_widgets_example_pickDate_text"/>
            
	<!-- 按鈕二,點擊彈出時間選擇對話框 -->
    <Button android:
            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:andro
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">
	
	 <!-- 內嵌日期選擇控件 -->
    <DatePicker android:
        android:layout_height="wrap_content"
        android:layout_width="match_parent"/>
      
     <!-- 內嵌時間選擇控件 -->  
    <TimePicker android:
        android:layout_height="wrap_content"
        android:layout_width="match_parent"/>
	 
	 <!-- 日期和時間顯示區 -->
    <TextView android:
            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》


預覽效果:

                  

最後更新:2017-04-02 06:51:56

  上一篇:go Android中安裝軟件到模擬器時提示:INSTALL_FAILED_INSUFFICIENT_STORAGE 解決辦法
  下一篇:go Android之四種加載方式