다음을 통해 공유


Android 시간 선택기

사용자가 시간을 선택할 수 있는 방법을 제공하려면 TimePicker를 사용할 수 있습니다. Android 앱은 일반적으로 TimePickerDialog와 함께 시간 값을 선택하는 데 사용합니다TimePicker. 이렇게 하면 디바이스 및 애플리케이션 간에 일관된 인터페이스를 보장하는 데 도움이 됩니다. TimePicker 를 사용하면 사용자가 24시간 또는 12시간 오전/오후 모드로 하루 중 시간을 선택할 수 있습니다. TimePickerDialog 는 대화 상자에서 캡슐화하는 TimePicker 도우미 클래스입니다.

작동 중인 시간 선택 대화 상자의 예제 스크린샷

개요

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

이 가이드에서는 로 래핑된 을 TimePickerDialog사용하는 방법을 보여 줍니다 DialogFragment. 샘플 애플리케이션은 사용자가 활동에서 단추를 클릭할 때 모달 대화 상자로 표시됩니다 TimePickerDialog . 사용자가 시간을 설정하면 대화 상자가 종료되고 처리기가 작업 화면에서 선택한 시간으로 업데이트 TextView 됩니다.

요구 사항

이 가이드의 샘플 애플리케이션은 Android 4.1(API 수준 16) 이상을 대상으로 하지만 Android 3.0(API 수준 11 이상)과 함께 사용할 수 있습니다. Android 지원 라이브러리 v4를 프로젝트에 추가하고 일부 코드를 변경하여 이전 버전의 Android를 지원할 수 있습니다.

TimePicker 사용

이 예제에서는 DialogFragment아래라고 하는 TimePickerFragment 하위 클래스 구현을 DialogFragment 확장하여 호스트하고 표시합니다TimePickerDialog. 샘플 앱이 처음 시작되면 선택한 시간을 표시하는 데 사용되는 선택 시간 단추가 위에 TextView 표시됩니다.

초기 샘플 앱 화면

시간 선택 단추를 클릭하면 이 스크린샷에 표시된 것처럼 예제 앱이 TimePickerDialog 시작됩니다.

앱에서 표시하는 기본 시간 선택 대화 상자의 스크린샷

TimePickerDialog에서 시간을 선택하고 확인 단추를 TimePickerDialog 클릭하면 IOnTimeSetListener.OnTimeSet 메서드가 호출됩니다. 이 인터페이스는 호스팅 DialogFragment 에 의해 구현됩니다(TimePickerFragment아래 설명 참조). 취소 단추를 클릭하면 조각과 대화 상자가 해제됩니다.

DialogFragment 는 다음 세 가지 방법 중 하나로 선택한 시간을 호스팅 활동으로 반환합니다.

  1. 메서드 호출 또는 속성 설정 – 활동은 이 값을 설정하기 위한 속성 또는 메서드를 제공할 수 있습니다.

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

  3. 사용 ActionDialogFragment 활동에서 시간을 표시하기 위해 호출 Action<DateTime> 할 수 있습니다. 활동은 인스턴스화DialogFragmentAction<DateTime 때를 제공합니다.

이 샘플은 작업에서 처리기를 DialogFragment제공해야 Action<DateTime> 하는 세 번째 기술을 사용합니다.

앱 프로젝트 시작

TimePickerDemo라는 새 Android 프로젝트를 시작합니다(Xamarin.Android 프로젝트 만들기에 익숙하지 않은 경우 Hello, Android를 참조하여 새 프로젝트를 만드는 방법을 알아보세요).

Resources/layout/Main.axml을 편집하고 해당 내용을 다음 XML로 바꿉니다.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal"
    android:padding="16dp">
    <Button
        android:id="@+id/select_button"
        android:paddingLeft="24dp"
        android:paddingRight="24dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="PICK TIME"
        android:textSize="20dp" />
    <TextView
        android:id="@+id/time_display"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:paddingTop="22dp"
        android:text="Picked time will be displayed here"
        android:textSize="24dp" />
</LinearLayout>

시간을 표시하는 TextView단추를 여TimePickerDialog는 단추가 있는 기본 LinearLayout입니다. 이 레이아웃은 하드 코딩된 문자열 및 차원을 사용하여 앱을 더 간단하고 쉽게 이해할 수 있도록 합니다. 프로덕션 앱은 일반적으로 이러한 값에 대한 리소스를 사용합니다(DatePicker 코드 예제에서 볼 수 있듯이).

MainActivity.cs 편집하고 해당 내용을 다음 코드로 바꿉니다.

using Android.App;
using Android.Widget;
using Android.OS;
using System;
using Android.Util;
using Android.Text.Format;

namespace TimePickerDemo
{
    [Activity(Label = "TimePickerDemo", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        TextView timeDisplay;
        Button timeSelectButton;

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Main);
            timeDisplay = FindViewById<TextView>(Resource.Id.time_display);
            timeSelectButton = FindViewById<Button>(Resource.Id.select_button);
        }
    }
}

이 예제를 빌드하고 실행하면 다음 스크린샷과 유사한 초기 화면이 표시됩니다.

초기 앱 화면

PICK TIME 단추를 클릭하면 아무 작업도 DialogFragment 수행되지 않습니다TimePicker. 다음 단계는 이 DialogFragment작업을 만드는 것입니다.

DialogFragment 확장

사용할 TimePicker수 있도록 확장 DialogFragment 하려면 파생 DialogFragment 되고 구현되는 서브클래스를 만들어야 합니다TimePickerDialog.IOnTimeSetListener. 다음 클래스를 MainActivity.cs 추가합니다.

public class TimePickerFragment : DialogFragment, TimePickerDialog.IOnTimeSetListener
{
    public static readonly string TAG = "MyTimePickerFragment";
    Action<DateTime> timeSelectedHandler = delegate { };

    public static TimePickerFragment NewInstance(Action<DateTime> onTimeSelected)
    {
        TimePickerFragment frag = new TimePickerFragment();
        frag.timeSelectedHandler = onTimeSelected;
        return frag;
    }

    public override Dialog OnCreateDialog (Bundle savedInstanceState)
    {
        DateTime currentTime = DateTime.Now;
        bool is24HourFormat = DateFormat.Is24HourFormat(Activity);
        TimePickerDialog dialog = new TimePickerDialog
            (Activity, this, currentTime.Hour, currentTime.Minute, is24HourFormat);
        return dialog;
    }

    public void OnTimeSet(TimePicker view, int hourOfDay, int minute)
    {
        DateTime currentTime = DateTime.Now;
        DateTime selectedTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, hourOfDay, minute, 0);
        Log.Debug(TAG, selectedTime.ToLongTimeString());
        timeSelectedHandler (selectedTime);
    }
}

TimePickerFragment 클래스는 더 작은 조각으로 세분화되며 다음 섹션에서 설명합니다.

DialogFragment 구현

TimePickerFragment에서는 팩터리 메서드, Dialog 인스턴스화 메서드 및 에 필요한 TimePickerDialog.IOnTimeSetListener처리기 메서드와 같은 여러 메서드를 OnTimeSet 구현합니다.

  • TimePickerFragmentDialogFragment의 하위 클래스입니다. 또한 인터페이스( TimePickerDialog.IOnTimeSetListener 즉, 필요한 OnTimeSet 메서드를 제공)를 구현합니다.

    public class TimePickerFragment : DialogFragment, TimePickerDialog.IOnTimeSetListener
    
  • TAG 로깅을 위해 초기화됩니다(MyTimePickerFragment 를 사용하려는 문자열로 변경할 수 있습니다). timeSelectedHandler 작업은 null 참조 예외를 방지하기 위해 빈 대리자로 초기화됩니다.

    public static readonly string TAG = "MyTimePickerFragment";
    Action<DateTime> timeSelectedHandler = delegate { };
    
  • NewInstance 팩터리 메서드는 새 TimePickerFragment인스턴스화하기 위해 호출됩니다. 이 메서드는 사용자가 다음에서 Action<DateTime>TimePickerDialog확인 단추를 클릭할 때 호출되는 처리기를 사용합니다.

    public static TimePickerFragment NewInstance(Action<DateTime> onTimeSelected)
    {
        TimePickerFragment frag = new TimePickerFragment();
        frag.timeSelectedHandler = onTimeSelected;
        return frag;
    }
    
  • 조각을 표시할 때 Android는 OnCreateDialog 메서드DialogFragment 호출합니다. 이 메서드는 새 TimePickerDialog 개체를 만들고 활동, 콜백 개체(현재 인스턴스 TimePickerFragment) 및 현재 시간으로 초기화합니다.

    public override Dialog OnCreateDialog (Bundle savedInstanceState)
    {
        DateTime currentTime = DateTime.Now;
        bool is24HourFormat = DateFormat.Is24HourFormat(Activity);
        TimePickerDialog dialog = new TimePickerDialog
            (Activity, this, currentTime.Hour, currentTime.Minute, is24HourFormat);
        return dialog;
    }
    
  • 사용자가 대화 상자에서 시간 설정을 TimePicker 변경하면 메서드가 OnTimeSet 호출됩니다. OnTimeSetDateTime 는 현재 날짜를 사용하여 개체를 만들고 사용자가 선택한 시간(시간 및 분)에 병합합니다.

    public void OnTimeSet(TimePicker view, int hourOfDay, int minute)
    {
        DateTime currentTime = DateTime.Now;
        DateTime selectedTime = new DateTime(currentTime.Year, currentTime.Month, currentTime.Day, hourOfDay, minute, 0);
    
  • DateTime 개체는 생성 시 개체에 등록된 개체에 TimePickerFragment 전달 timeSelectedHandler 됩니다. OnTimeSet 이 처리기를 호출하여 작업의 시간 표시를 선택한 시간으로 업데이트합니다(이 처리기는 다음 섹션에서 구현됨).

    timeSelectedHandler (selectedTime);
    

TimePickerFragment 표시

DialogFragment 이제 구현되었으므로 Using NewInstance 팩터리 메서드를 인스턴스화 DialogFragment 하고 DialogFragment.Show를 호출하여 표시해야 합니다.

MainActivity에 다음 메서드를 추가합니다.

void TimeSelectOnClick (object sender, EventArgs eventArgs)
{
    TimePickerFragment frag = TimePickerFragment.NewInstance (
        delegate (DateTime time)
        {
            timeDisplay.Text = time.ToShortTimeString();
        });

    frag.Show(FragmentManager, TimePickerFragment.TAG);
}

인스턴스화한 TimePickerFragmentTimeSelectOnClick 활동의 시간 표시를 전달된 시간 값으로 업데이트하는 익명 메서드에 대한 대리자를 만들고 전달합니다. 마지막으로 대화 상자 조각을 시작 TimePicker (통해 DialogFragment.Show)하여 사용자에게 표시 TimePicker 합니다.

메서드의 OnCreate 끝에서 다음 줄을 추가하여 이벤트 처리기를 대화 상자를 시작하는 PICK TIME 단추에 연결합니다.

timeSelectButton.Click += TimeSelectOnClick;

PICK TIME 단추를 클릭하면 TimeSelectOnClick 사용자에게 대화 상자 조각을 표시 TimePicker 하기 위해 호출됩니다.

실습

앱을 빌드하고 실행합니다. 시간 선택 단추를 TimePickerDialog 클릭하면 활동의 기본 시간 형식으로 표시됩니다(이 경우 오전 12시/오후 모드).

시간 대화 상자가 AM/PM 모드로 표시됩니다.

대화 상자에서 TimePicker 확인을 클릭하면 처리기가 선택한 시간으로 활동을 TextView 업데이트한 다음 종료됩니다.

작업 TextView에 A/M 시간이 표시됩니다.

다음으로 선언되고 초기화된 직후 is24HourFormatOnCreateDialog 다음 코드 줄을 추가합니다.

is24HourFormat = true;

이렇게 변경하면 생성자에 true 전달된 TimePickerDialog 플래그가 강제로 적용되므로 호스팅 활동의 시간 형식 대신 24시간 모드가 사용됩니다. 앱을 다시 빌드하고 실행하면 PICK TIME 단추를 TimePicker 클릭하면 대화 상자가 24시간 형식으로 표시됩니다.

24시간 형식의 TimePicker 대화 상자

처리기가 DateTime.ToShortTimeString을 호출하여 작업의 TextView시간을 인쇄하기 때문에 시간은 여전히 기본 오전/오후 12시간 형식으로 인쇄됩니다.

요약

이 문서에서는 TimePicker Android 활동에서 위젯을 팝업 모달 대화 상자로 표시하는 방법을 설명했습니다. 샘플 DialogFragment 구현을 제공하고 인터페이스에 대해 설명했습니다 IOnTimeSetListener . 이 샘플에서는 호스트 활동과 상호 작용하여 선택한 시간을 표시하는 방법 DialogFragment 도 설명했습니다.