189 lines
6.7 KiB
Java
189 lines
6.7 KiB
Java
/*
|
|
* 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.TextUtils.TruncateAt;
|
|
import android.text.format.DateFormat;
|
|
import android.view.LayoutInflater;
|
|
import android.view.View;
|
|
import android.widget.DatePicker;
|
|
import android.widget.TextView;
|
|
import android.widget.DatePicker.OnDateChangedListener;
|
|
|
|
import com.android.internal.R;
|
|
|
|
import java.text.DateFormatSymbols;
|
|
import java.util.Calendar;
|
|
|
|
/**
|
|
* A simple dialog containing an {@link android.widget.DatePicker}.
|
|
*
|
|
* <p>See the <a href="{@docRoot}resources/tutorials/views/hello-datepicker.html">Date Picker
|
|
* tutorial</a>.</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 final java.text.DateFormat mTitleDateFormat;
|
|
private final String[] mWeekDays;
|
|
|
|
private int mInitialYear;
|
|
private int mInitialMonth;
|
|
private int mInitialDay;
|
|
|
|
/**
|
|
* 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, com.android.internal.R.style.Theme_Dialog_Alert,
|
|
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;
|
|
mInitialYear = year;
|
|
mInitialMonth = monthOfYear;
|
|
mInitialDay = dayOfMonth;
|
|
DateFormatSymbols symbols = new DateFormatSymbols();
|
|
mWeekDays = symbols.getShortWeekdays();
|
|
|
|
mTitleDateFormat = java.text.DateFormat.
|
|
getDateInstance(java.text.DateFormat.FULL);
|
|
mCalendar = Calendar.getInstance();
|
|
updateTitle(mInitialYear, mInitialMonth, mInitialDay);
|
|
|
|
setButton(context.getText(R.string.date_time_set), this);
|
|
setButton2(context.getText(R.string.cancel), (OnClickListener) null);
|
|
setIcon(R.drawable.ic_dialog_time);
|
|
|
|
LayoutInflater inflater =
|
|
(LayoutInflater) context.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(mInitialYear, mInitialMonth, mInitialDay, this);
|
|
}
|
|
|
|
@Override
|
|
public void show() {
|
|
super.show();
|
|
|
|
/* Sometimes the full month is displayed causing the title
|
|
* to be very long, in those cases ensure it doesn't wrap to
|
|
* 2 lines (as that looks jumpy) and ensure we ellipsize the end.
|
|
*/
|
|
TextView title = (TextView) findViewById(R.id.alertTitle);
|
|
title.setSingleLine();
|
|
title.setEllipsize(TruncateAt.END);
|
|
}
|
|
|
|
public void onClick(DialogInterface dialog, int which) {
|
|
if (mCallBack != null) {
|
|
mDatePicker.clearFocus();
|
|
mCallBack.onDateSet(mDatePicker, mDatePicker.getYear(),
|
|
mDatePicker.getMonth(), mDatePicker.getDayOfMonth());
|
|
}
|
|
}
|
|
|
|
public void onDateChanged(DatePicker view, int year,
|
|
int month, int day) {
|
|
updateTitle(year, month, day);
|
|
}
|
|
|
|
public void updateDate(int year, int monthOfYear, int dayOfMonth) {
|
|
mInitialYear = year;
|
|
mInitialMonth = monthOfYear;
|
|
mInitialDay = dayOfMonth;
|
|
mDatePicker.updateDate(year, monthOfYear, dayOfMonth);
|
|
}
|
|
|
|
private void updateTitle(int year, int month, int day) {
|
|
mCalendar.set(Calendar.YEAR, year);
|
|
mCalendar.set(Calendar.MONTH, month);
|
|
mCalendar.set(Calendar.DAY_OF_MONTH, day);
|
|
setTitle(mTitleDateFormat.format(mCalendar.getTime()));
|
|
}
|
|
|
|
@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);
|
|
updateTitle(year, month, day);
|
|
}
|
|
}
|