筆記8 | 系統時間設置界面DatePickerDialog,TimePickerDialog,DatePicker

地址


最近工做的時候須要設置時間日期日曆等,最終選用的是DatePickerDialog和TimePickerDialog方法來實現,因爲還沒自定義佈局,直接調用就能夠,實現起來挺簡單,如今經過實現和查看源碼來進行解析;javascript

目錄

  • DatePickerDialog實現和分析
  • TimePickerDialog實現和分析
  • DatePicker實現和分析

DatePickerDialog實現和分析

主要代碼:html

 
 
 
 
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.classjava

 
 
 
 
/* * 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">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源碼android

 
 
 
 
/* * 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">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" />

是的,只需這麼個玩意就能夠調出感受很高大上的日曆界面,源碼就不貼了,太長,若是要自定義界面的話能夠研究一下!```express

相關文章
相關標籤/搜索