位址
最近工作的時候需要設定時間日期月曆等,最終選用的是DatePickerDialog和TimePickerDialog方法來實作,由于還沒自定義布局,直接調用就可以,實作起來挺簡單,現在通過實作和檢視源碼來進行解析;
目錄
- DatePickerDialog實作和分析
- TimePickerDialog實作和分析
- DatePicker實作和分析
DatePickerDialog實作和分析
主要代碼:
- int year,month,day,s,f,m;
- private void initDataTime() {//擷取時間資訊
- Calendar calendar = Calendar.getInstance();
- year = calendar.get(Calendar.YEAR); //年
- month = calendar.get(Calendar.WEEK_OF_MONTH); //月
- day = calendar.get(Calendar.DAY_OF_YEAR); //日
- s = calendar.get(Calendar.HOUR_OF_DAY); //時
- f = calendar.get(Calendar.MINUTE); //分
- m = calendar.get(Calendar.SECOND); //秒
- }
- DatePickerDialog.OnDateSetListener onDateSetListene = new DatePickerDialog.OnDateSetListener() {
-
- @Override
- public void onDateSet(DatePicker view, int year, int monthOfYear,
- int dayOfMonth) {
-
- }
- };
- Button button1= (Button) findViewById(R.id.b01);//打開年月日設定界面
- button1.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
- new DatePickerDialog(getApplication(), R.style.AppTheme,onDateSetListene , year,month,day);
- }
- });
調出系統的時間設定界面即可對系統時間進行設定,簡單明了,我們看看源碼是怎麼實作的:DatePickerDialog.class
- /*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
- package android.app;
-
- import android.content.Context;
- import android.content.DialogInterface;
- import android.content.DialogInterface.OnClickListener;
- import android.os.Bundle;
- import android.text.format.DateUtils;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.widget.DatePicker;
- import android.widget.DatePicker.OnDateChangedListener;
-
- import com.android.internal.R;
-
- import java.util.Calendar;
-
- /**
- * A simple dialog containing an {@link android.widget.DatePicker}.
- *
- * <p>See the <a href="{@docRoot}guide/topics/ui/controls/pickers.html" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >Pickers</a>
- * guide.</p>
- */
- public class DatePickerDialog extends AlertDialog implements OnClickListener,
- OnDateChangedListener {
-
- private static final String YEAR = "year";
- private static final String MONTH = "month";
- private static final String DAY = "day";
-
- private final DatePicker mDatePicker; //用于存取動态的時間值
- private final OnDateSetListener mCallBack;
- private final Calendar mCalendar;
-
- private boolean mTitleNeedsUpdate = true;
-
- /**
- * The callback used to indicate the user is done filling in the date.
- */
- public interface OnDateSetListener {
-
- /**
- * @param view The view associated with this listener.
- * @param year The year that was set.
- * @param monthOfYear The month that was set (0-11) for compatibility
- * with {@link java.util.Calendar}.
- * @param dayOfMonth The day of the month that was set.
- */
- void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth);
- }
-
- /** 方法 一
- * @param context The context the dialog is to run in.
- * @param callBack How the parent is notified that the date is set.
- * @param year The initial year of the dialog.
- * @param monthOfYear The initial month of the dialog.
- * @param dayOfMonth The initial day of the dialog.
- */
- public DatePickerDialog(Context context,
- OnDateSetListener callBack, //傳對應的方法進來,通知父節點設定日期
- int year, //
- int monthOfYear,
- int dayOfMonth) {
- this(context, 0, callBack, year, monthOfYear, dayOfMonth);
- }
-
- /** 方法 二
- * @param context The context the dialog is to run in.
- * @param theme the theme to apply to this dialog
- * @param callBack How the parent is notified that the date is set.
- * @param year The initial year of the dialog.
- * @param monthOfYear The initial month of the dialog.
- * @param dayOfMonth The initial day of the dialog.
- * /
- public DatePickerDialog(Context context,
- int theme, //傳入對應的主題
- OnDateSetListener callBack, //傳對應的時間設定方法進來,通知父節點設定日期
- int year,
- int monthOfYear,
- int dayOfMonth) {
- super(context, theme);
-
- mCallBack = callBack;
-
- mCalendar = Calendar.getInstance();
-
- Context themeContext = getContext();
- setButton(BUTTON_POSITIVE, themeContext.getText(R.string.date_time_done), this);
- setIcon(0);
-
- LayoutInflater inflater =
- (LayoutInflater) themeContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- View view = inflater.inflate(R.layout.date_picker_dialog, null);
- setView(view);
- mDatePicker = (DatePicker) view.findViewById(R.id.datePicker);
- mDatePicker.init(year, monthOfYear, dayOfMonth, this);
- updateTitle(year, monthOfYear, dayOfMonth);
- }
-
- public void onClick(DialogInterface dialog, int which) {
- tryNotifyDateSet();
- }
-
- public void onDateChanged(DatePicker view, int year,
- int month, int day) {
- mDatePicker.init(year, month, day, this);
- updateTitle(year, month, day);
- }
-
- /**
- * Gets the {@link DatePicker} contained in this dialog.
- *
- * @return The calendar view.
- */
- public DatePicker getDatePicker() { //首先會拿到目前DatePicker
- return mDatePicker;
- }
-
- /**
- * 設定日期
- *
- * @param year The date year.
- * @param monthOfYear The date month.
- * @param dayOfMonth The date day of month.
- */
- public void updateDate(int year, int monthOfYear, int dayOfMonth) {
- mDatePicker.updateDate(year, monthOfYear, dayOfMonth);
- }
-
- private void tryNotifyDateSet() {//将動态的時間傳給mCallBack方法
- if (mCallBack != null) {
- mDatePicker.clearFocus();
- mCallBack.onDateSet(mDatePicker, mDatePicker.getYear(),
- mDatePicker.getMonth(), mDatePicker.getDayOfMonth());
- }
- }
-
- @Override
- protected void onStop() {
- tryNotifyDateSet();
- super.onStop();
- }
-
- private void updateTitle(int year, int month, int day) {
- if (!mDatePicker.getCalendarViewShown()) {
- mCalendar.set(Calendar.YEAR, year);
- mCalendar.set(Calendar.MONTH, month);
- mCalendar.set(Calendar.DAY_OF_MONTH, day);
- String title = DateUtils.formatDateTime(mContext,
- mCalendar.getTimeInMillis(),
- DateUtils.FORMAT_SHOW_DATE
- | DateUtils.FORMAT_SHOW_WEEKDAY
- | DateUtils.FORMAT_SHOW_YEAR
- | DateUtils.FORMAT_ABBREV_MONTH
- | DateUtils.FORMAT_ABBREV_WEEKDAY);
- setTitle(title);
- mTitleNeedsUpdate = true;
- } else {
- if (mTitleNeedsUpdate) {
- mTitleNeedsUpdate = false;
- setTitle(R.string.date_picker_dialog_title);
- }
- }
- }
-
- @Override
- public Bundle onSaveInstanceState() {
- Bundle state = super.onSaveInstanceState();
- state.putInt(YEAR, mDatePicker.getYear());
- state.putInt(MONTH, mDatePicker.getMonth());
- state.putInt(DAY, mDatePicker.getDayOfMonth());
- return state;
- }
-
- @Override
- public void onRestoreInstanceState(Bundle savedInstanceState) {
- super.onRestoreInstanceState(savedInstanceState);
- int year = savedInstanceState.getInt(YEAR);
- int month = savedInstanceState.getInt(MONTH);
- int day = savedInstanceState.getInt(DAY);
- mDatePicker.init(year, month, day, this);
- }
- }
TimePickerDialog實作和源碼
- TimePickerDialog.OnTimeSetListener onTimeSetListene = new TimePickerDialog.OnTimeSetListener() {
-
- @Override
- public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
-
- }
- };
-
- ContentResolver cv = this.getContentResolver();
- String strTimeFormat = android.provider.Settings.System.getString(cv,
- android.provider.Settings.System.TIME_12_24);
- public boolean is24(){//判斷是否為24小時制
- return strTimeFormat.equals("24");
- }
-
- Button button2= (Button) findViewById(R.id.b02);//彈出系統時間界面
- button2.setOnClickListener(new OnClickListener() {
-
- @Override
- public void onClick(View v) {
- new TimePickerDialog(getApplication(), onTimeSetListene, s, f, is24());
- }
- });
兩個源碼差不多,TimePickerDialog隻是多傳了一個is24hour進來,我就不多做解釋。TimePickerDialog.class源碼
- /*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
- package android.app;
-
- import com.android.internal.R;
-
- import android.content.Context;
- import android.content.DialogInterface;
- import android.content.DialogInterface.OnClickListener;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.widget.TimePicker;
- import android.widget.TimePicker.OnTimeChangedListener;
-
- /**
- * A dialog that prompts the user for the time of day using a {@link TimePicker}.
- *
- * <p>See the <a href="{@docRoot}guide/topics/ui/controls/pickers.html" target="_blank" rel="external nofollow" target="_blank" rel="external nofollow" >Pickers</a>
- * guide.</p>
- */
- public class TimePickerDialog extends AlertDialog
- implements OnClickListener, OnTimeChangedListener {
-
- /**
- * The callback interface used to indicate the user is done filling in
- * the time (they clicked on the 'Set' button).
- */
- public interface OnTimeSetListener {
-
- /**
- * @param view The view associated with this listener.
- * @param hourOfDay The hour that was set.
- * @param minute The minute that was set.
- */
- void onTimeSet(TimePicker view, int hourOfDay, int minute);
- }
-
- private static final String HOUR = "hour";
- private static final String MINUTE = "minute";
- private static final String IS_24_HOUR = "is24hour";
-
- private final TimePicker mTimePicker;
- private final OnTimeSetListener mCallback;
-
- int mInitialHourOfDay;
- int mInitialMinute;
- boolean mIs24HourView;
-
- /**
- * @param context Parent.
- * @param callBack How parent is notified.
- * @param hourOfDay The initial hour.
- * @param minute The initial minute.
- * @param is24HourView Whether this is a 24 hour view, or AM/PM.
- */
- public TimePickerDialog(Context context,
- OnTimeSetListener callBack,
- int hourOfDay, int minute, boolean is24HourView) {
- this(context, 0, callBack, hourOfDay, minute, is24HourView);
- }
-
- /**
- * @param context Parent.
- * @param theme the theme to apply to this dialog
- * @param callBack How parent is notified.
- * @param hourOfDay The initial hour.
- * @param minute The initial minute.
- * @param is24HourView Whether this is a 24 hour view, or AM/PM.
- */
- public TimePickerDialog(Context context,
- int theme,
- OnTimeSetListener callBack,
- int hourOfDay, int minute, boolean is24HourView) {
- super(context, theme);
- mCallback = callBack;
- mInitialHourOfDay = hourOfDay;
- mInitialMinute = minute;
- mIs24HourView = is24HourView;
-
- setIcon(0);
- setTitle(R.string.time_picker_dialog_title);
-
- Context themeContext = getContext();
- setButton(BUTTON_POSITIVE, themeContext.getText(R.string.date_time_done), this);
-
- LayoutInflater inflater =
- (LayoutInflater) themeContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
- View view = inflater.inflate(R.layout.time_picker_dialog, null);
- setView(view);
- mTimePicker = (TimePicker) view.findViewById(R.id.timePicker);
-
- // initialize state
- mTimePicker.setIs24HourView(mIs24HourView);
- mTimePicker.setCurrentHour(mInitialHourOfDay);
- mTimePicker.setCurrentMinute(mInitialMinute);
- mTimePicker.setOnTimeChangedListener(this);
- }
-
- public void onClick(DialogInterface dialog, int which) {
- tryNotifyTimeSet();
- }
-
- public void updateTime(int hourOfDay, int minutOfHour) {
- mTimePicker.setCurrentHour(hourOfDay);
- mTimePicker.setCurrentMinute(minutOfHour);
- }
-
- public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
- /* do nothing */
- }
-
- private void tryNotifyTimeSet() {
- if (mCallback != null) {
- mTimePicker.clearFocus();
- mCallback.onTimeSet(mTimePicker, mTimePicker.getCurrentHour(),
- mTimePicker.getCurrentMinute());
- }
- }
-
- @Override
- protected void onStop() {
- tryNotifyTimeSet();
- super.onStop();
- }
-
- @Override
- public Bundle onSaveInstanceState() {
- Bundle state = super.onSaveInstanceState();
- state.putInt(HOUR, mTimePicker.getCurrentHour());
- state.putInt(MINUTE, mTimePicker.getCurrentMinute());
- state.putBoolean(IS_24_HOUR, mTimePicker.is24HourView());
- return state;
- }
-
- @Override
- public void onRestoreInstanceState(Bundle savedInstanceState) {
- super.onRestoreInstanceState(savedInstanceState);
- int hour = savedInstanceState.getInt(HOUR);
- int minute = savedInstanceState.getInt(MINUTE);
- mTimePicker.setIs24HourView(savedInstanceState.getBoolean(IS_24_HOUR));
- mTimePicker.setCurrentHour(hour);
- mTimePicker.setCurrentMinute(minute);
- }
- }
DatePicker月曆的調用
- <DatePicker
- android:id="@+id/textView1"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:text="TextView" />
是的,隻需這麼個玩意就可以調出感覺很高大上的月曆界面,源碼就不貼了,太長,如果要自定義界面的話可以研究一下!```