Android Date Picker
概要
ユーザーが Android アプリケーションにデータを入力しなければならない場合があります。 これを支援するために、Android フレームワークには DatePicker
ウィジェットと DatePickerDialog
が用意されています。 DatePicker
を使用すると、ユーザーは、デバイスやアプリケーション間で一貫性のあるインターフェイスで年、月、日を選択できます。 DatePickerDialog
は、ダイアログに DatePicker
をカプセル化するヘルパー クラスです。
最新の Android アプリケーションは、DialogFragment
で DatePickerDialog
を表示します。 これにより、アプリケーションで DatePicker をポップアップ ダイアログとして表示するか、アクティビティに埋め込むことができます。 さらに、DialogFragment
はダイアログのライフサイクルと表示を管理して、実装する必要があるコードの量を減らします。
このガイドでは、DialogFragment
にラップされた DatePickerDialog
を使用する方法を示します。 サンプル アプリケーションでは、ユーザーがアクティビティのボタンをクリックすると、DatePickerDialog
がモーダル ダイアログとして表示されます。 ユーザーが日付を設定すると、TextView
が、選択された日付で更新されます。
要件
このガイドのサンプル アプリケーションは Android 4.1 (API レベル 16) 以降を対象としていますが、Android 3.0 (API レベル 11 以上) に適用できます。 Android サポート ライブラリ v4 をプロジェクトに追加し、いくつかのコードを変更して、古いバージョンの Android をサポートすることが可能です。
DatePicker の使用
このサンプルでは DialogFragment
が拡張されます。 サブクラスは DatePickerDialog
をホストして表示します。
ユーザーが日付を選択し、[OK] ボタンをクリックすると、DatePickerDialog
がメソッド IOnDateSetListener.OnDateSet
を呼び出します。
このインターフェイスは、ホスト DialogFragment
によって実装されます。 ユーザーが [キャンセル] ボタンをクリックすると、フラグメントとダイアログが閉じます。
DialogFragment
が選択された日付をホスト アクティビティに返すには、いくつかの方法があります。
メソッドを呼び出すか、プロパティを設定する - アクティビティは、特にこの値を設定するためのプロパティまたはメソッドを提供できます。
イベントを発生させる –
DialogFragment
は、OnDateSet
が起動されたときに発生するイベントを定義できます。Action
を使用する –DialogFragment
は、Action<DateTime>
を起動してアクティビティに日付を表示することができます。 アクティビティは、DialogFragment
をインスタンス化するときにAction<DateTime
を提供します。 このサンプルでは、3 つ目の手法を使用し、アクティビティがAction<DateTime>
をDialogFragment
に提供する必要があります。
DialogFragment の拡張
DatePickerDialog
を表示する最初の手順では、DialogFragment
をサブクラス化し、IOnDateSetListener
インターフェイスを実装します。
public class DatePickerFragment : DialogFragment,
DatePickerDialog.IOnDateSetListener
{
// TAG can be any string of your choice.
public static readonly string TAG = "X:" + typeof (DatePickerFragment).Name.ToUpper();
// Initialize this value to prevent NullReferenceExceptions.
Action<DateTime> _dateSelectedHandler = delegate { };
public static DatePickerFragment NewInstance(Action<DateTime> onDateSelected)
{
DatePickerFragment frag = new DatePickerFragment();
frag._dateSelectedHandler = onDateSelected;
return frag;
}
public override Dialog OnCreateDialog(Bundle savedInstanceState)
{
DateTime currently = DateTime.Now;
DatePickerDialog dialog = new DatePickerDialog(Activity,
this,
currently.Year,
currently.Month - 1,
currently.Day);
return dialog;
}
public void OnDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)
{
// Note: monthOfYear is a value between 0 and 11, not 1 and 12!
DateTime selectedDate = new DateTime(year, monthOfYear + 1, dayOfMonth);
Log.Debug(TAG, selectedDate.ToLongDateString());
_dateSelectedHandler(selectedDate);
}
}
NewInstance
メソッドが、新しい DatePickerFragment
のインスタンスを作成するために起動されます。 このメソッドは、ユーザーが DatePickerDialog
で [OK] ボタンをクリックしたときに起動される Action<DateTime>
を受け取ります。
フラグメントが表示される場合、Android はメソッド OnCreateDialog
を呼び出します。 このメソッドは、新しい DatePickerDialog
オブジェクトを作成し、現在の日付とコールバック オブジェクト (DatePickerFragment
の現在のンスタンス) を使用して初期化します。
Note
IOnDateSetListener.OnDateSet
が呼び出される月の値は、1 から 12 ではなく、0 から 11 の範囲であることに注意してください。 月の日付は 1 から 31 の範囲になります (選択された月によって異なります)。
DatePickerFragment の表示
DialogFragment
が実装されたので、このセクションではアクティビティでフラグメントを使用する方法について説明します。 このガイドに付属するサンプル アプリでは、アクティビティは NewInstance
ファクトリ メソッドを使用して DialogFragment
のインスタンスを作成してから、表示して DialogFragment.Show
を起動します。 DialogFragment
のインスタンス作成の一環として、アクティビティは、アクティビティによってホストされる TextView
で日付を表示する Action<DateTime>
を渡します。
[Activity(Label = "@string/app_name", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
TextView _dateDisplay;
Button _dateSelectButton;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
_dateDisplay = FindViewById<TextView>(Resource.Id.date_display);
_dateSelectButton = FindViewById<Button>(Resource.Id.date_select_button);
_dateSelectButton.Click += DateSelect_OnClick;
}
void DateSelect_OnClick(object sender, EventArgs eventArgs)
{
DatePickerFragment frag = DatePickerFragment.NewInstance(delegate(DateTime time)
{
_dateDisplay.Text = time.ToLongDateString();
});
frag.Show(FragmentManager, DatePickerFragment.TAG);
}
}
まとめ
このサンプルでは、Android アクティビティの一部としてポップアップ モーダル ダイアログとして DatePicker
ウィジェットを表示する方法について説明しました。 DialogFragment 実装のサンプルを提供し、IOnDateSetListener
インターフェイスについて説明しました。 また、このサンプルでは、DialogFragment が選択された日付を表示するためにホスト アクティビティと対話する方法も示しました。