다음을 통해 공유


Android 날짜 선택기

개요

사용자가 Android 애플리케이션에 데이터를 입력해야 하는 경우가 있습니다. 이를 지원하기 위해 Android 프레임워크는 DatePicker 위젯과 DatePickerDialog . 이를 DatePicker 통해 사용자는 디바이스 및 애플리케이션 간에 일관된 인터페이스에서 연도, 월 및 일을 선택할 수 있습니다. DatePickerDialog 대화 상자에서 캡슐화하는 DatePicker 도우미 클래스입니다.

최신 Android 애플리케이션은 에 DialogFragment표시 DatePickerDialog 되어야 합니다. 이렇게 하면 애플리케이션에서 DatePicker를 팝업 대화 상자로 표시하거나 활동에 포함할 수 있습니다. 또한 DialogFragment 대화 상자의 수명 주기 및 표시를 관리하여 구현해야 하는 코드의 양을 줄입니다.

이 가이드에서는 로 래핑된 DialogFragmentDatePickerDialog사용하는 방법을 보여 줍니다. 샘플 애플리케이션은 사용자가 활동에서 단추를 클릭할 때 모달 대화 상자로 표시됩니다 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

사용자가 날짜를 선택하고 확인 단추를 클릭하면 메서드IOnDateSetListener.OnDateSetDatePickerDialog 호출합니다. 이 인터페이스는 호스팅 DialogFragment에 의해 구현됩니다. 사용자가 취소 단추를 클릭하면 조각화와 대화 상자가 해제됩니다.

선택한 날짜를 호스팅 활동으로 반환할 수 있는 방법에는 여러 가지 DialogFragment 가 있습니다.

  1. 메서드를 호출하거나 속성을 설정합니다. 활동은 이 값을 설정하기 위해 특별히 속성 또는 메서드를 제공할 수 있습니다.

  2. 이벤트 발생 – DialogFragment 호출될 때 OnDateSet 발생할 이벤트를 정의할 수 있습니다.

  3. Action 사용 – DialogFragment 활동에서 날짜를 표시하기 위해 호출 Action<DateTime> 할 수 있습니다. 활동은 인스턴스화DialogFragmentAction<DateTime 때를 제공합니다. 이 샘플은 세 번째 기술을 사용하며, 활동이 에 제공 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사용합니다Action<DateTime>.

조각이 표시될 때 Android는 메서드 OnCreateDialog를 호출합니다. 이 메서드는 새 DatePickerDialog 개체를 만들고 현재 날짜 및 콜백 개체(현재 인스턴스 DatePickerFragment)를 사용하여 초기화합니다.

참고 항목

호출되는 월 IOnDateSetListener.OnDateSet 의 값은 1에서 12가 아니라 0에서 11까지의 범위에 있습니다. 해당 월의 날짜는 선택한 월에 따라 1에서 31까지입니다.

DatePickerFragment 표시

DialogFragment 이제 구현되었으므로 이 섹션에서는 작업에서 조각을 사용하는 방법을 살펴봅니다. 이 가이드와 함께 제공되는 샘플 앱에서 작업은 using 팩터리 메서드를 DialogFragment NewInstance 인스턴스화한 다음 호출을 표시합니다 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가 호스트 활동과 상호 작용하여 선택한 날짜를 표시하는 방법을 보여 줬습니다.