Share via


Android Date Picker

概要

ユーザーが Android アプリケーションにデータを入力しなければならない場合があります。 これを支援するために、Android フレームワークには DatePicker ウィジェットと DatePickerDialog が用意されています。 DatePicker を使用すると、ユーザーは、デバイスやアプリケーション間で一貫性のあるインターフェイスで年、月、日を選択できます。 DatePickerDialog は、ダイアログに DatePicker をカプセル化するヘルパー クラスです。

最新の Android アプリケーションは、DialogFragmentDatePickerDialog を表示します。 これにより、アプリケーションで DatePicker をポップアップ ダイアログとして表示するか、アクティビティに埋め込むことができます。 さらに、DialogFragment はダイアログのライフサイクルと表示を管理して、実装する必要があるコードの量を減らします。

このガイドでは、DialogFragment にラップされた DatePickerDialog を使用する方法を示します。 サンプル アプリケーションでは、ユーザーがアクティビティのボタンをクリックすると、DatePickerDialog がモーダル ダイアログとして表示されます。 ユーザーが日付を設定すると、TextView が、選択された日付で更新されます。

Screenshot of Pick Date button followed by Date Picker dialog

要件

このガイドのサンプル アプリケーションは Android 4.1 (API レベル 16) 以降を対象としていますが、Android 3.0 (API レベル 11 以上) に適用できます。 Android サポート ライブラリ v4 をプロジェクトに追加し、いくつかのコードを変更して、古いバージョンの Android をサポートすることが可能です。

DatePicker の使用

このサンプルでは DialogFragment が拡張されます。 サブクラスは DatePickerDialog をホストして表示します。

Closeup of Date Picker dialog

ユーザーが日付を選択し、[OK] ボタンをクリックすると、DatePickerDialog がメソッド IOnDateSetListener.OnDateSet を呼び出します。 このインターフェイスは、ホスト DialogFragment によって実装されます。 ユーザーが [キャンセル] ボタンをクリックすると、フラグメントとダイアログが閉じます。

DialogFragment が選択された日付をホスト アクティビティに返すには、いくつかの方法があります。

  1. メソッドを呼び出すか、プロパティを設定する - アクティビティは、特にこの値を設定するためのプロパティまたはメソッドを提供できます。

  2. イベントを発生させるDialogFragment は、OnDateSet が起動されたときに発生するイベントを定義できます。

  3. 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 が選択された日付を表示するためにホスト アクティビティと対話する方法も示しました。