๊ธ€ ์ž‘์„ฑ์ž: ์ด์ง€์›๐ŸŒฉ๏ธ

์ด ๊ธ€์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์•ˆ๋“œ๋กœ์ด๋“œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ๊ฐ„์„ ์„ ํƒํ•˜๊ฑฐ๋‚˜ ๋‚ ์งœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€ํ™” ์ƒ์ž๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์ปจํŠธ๋กค์„ ์ œ๊ณตํ•œ๋‹ค. ๊ฐ Picker๋Š” ์‹œ๊ฐ„ (์‹œ, ๋ถ„, ์˜ค์ „ / ์˜คํ›„) ๋˜๋Š” ๋‚ ์งœ (์›”, ์ผ, ๋…„)์˜ ๋ถ€๋ถ„์„ ์„ ํƒํ•˜๋Š” ์ปจํŠธ๋กค์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ Picker๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์œ ํšจํ•˜๊ณ , ํ˜•์‹์ด ์ •ํ™•ํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž ์ง€์—ญ์— ๋งž๊ฒŒ ์กฐ์ •๋œ ์‹œ๊ฐ„ ๋˜๋Š” ๋‚ ์งœ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.

Android Developer์—์„œ๋Š” DialogFragment๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ๊ณ ํ•œ๋‹ค. DialogFragment๋Š” Dialog์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ๋‹จ๋ง๊ธฐ์˜ ๊ธฐ๋ณธ dialog ๋˜๋Š” ํฐ ํ™”๋ฉด์˜ ๋ ˆ์ด์•„์›ƒ์— ํฌํ•จํ•œ ๋ถ€๋ถ„๊ณผ ๊ฐ™์ด ๋‹ค์–‘ํ•œ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ์œผ๋กœ Picker๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. [^1]

DialogFragment๋Š” Android 3.0(API ๋ ˆ๋ฒจ 11) ๋•Œ ์ฒ˜์Œ ์ถ”๊ฐ€๋˜์—ˆ์ง€๋งŒ, Android 1.6๋ณด๋‹ค ๋‚ฎ์€ ๋ฒ„์ „์˜ Android๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” Support Library์—์„œ DialogFragmentํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋‹ค.

Time Picker ๋งŒ๋“ค๊ธฐ

DialogFragment๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ TimePickerDialog๋ฅผ ํ‘œ์‹œํ•˜๋ ค๋ฉด DialogFragment๋ฅผ ์ƒ์†๋ฐ›๋Š” ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , TimePickerDialog๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” onClreateDialog() ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

Time Picker๋ฅผ ์œ„ํ•œ DialogFragment ์ƒ์† [^2]

TimePickerDialog๋ฅผ ์œ„ํ•œ DialogFragment๋ฅผ ์ •์˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • onCreateDialog() ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค. ์ด ๋ฉ”์†Œ๋“œ๋Š” TimePickerDialog์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ์‹œ๊ฐ„์„ ์„ค์ •ํ•  ๋•Œ ์ฝœ๋ฐฑ[^3]์„ ์ˆ˜์‹ ํ•˜๊ธฐ ์œ„ํ•ด TimePickerDialog.OnTimeSetListener ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ(Kotlin):

class TimePickerFragment : DialogFragment(), TimePickerDialog.OnTimeSetListener {

    override fun onCreateDialog(savedInstanceState: Bundle): Dialog {
        // Use the current time as the default values for the picker
        val c = Calendar.getInstance()
        val hour = c.get(Calendar.HOUR_OF_DAY)
        val minute = c.get(Calendar.MINUTE)

        // Create a new instance of TimePickerDialog and return it
        return TimePickerDialog(activity, this, hour, minute, DateFormat.is24HourFormat(activity))
    }

    override fun onTimeSet(view: TimePicker, hourOfDay: Int, minute: Int) {
        // Do something with the time chosen by the user
    }
}

์ƒ์„ฑ์ž ์ธ์ˆ˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ TimePickerDialog ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐ.

์ด์ œ ํ”„๋ž˜๊ทธ๋จผํŠธ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋‹น์‹ ์˜ ์•กํ‹ฐ๋น„ํ‹ฐ์— ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค. [^4]

Time Picker ๋ณด์—ฌ์ฃผ๊ธฐ

์œ„์— ํ‘œ์‹œ๋œ ๊ฒƒ๊ณผ ๊ฐ™์€ DialogFragment๋ฅผ ์ •์˜ํ•œ ํ›„์—๋Š” DialogFragment ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  show() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Time Picker๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ํด๋ฆญํ•˜๋ฉด Dialog๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฒ„ํŠผ์ด๋‹ค. [^5]

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/pick_time"
    android:onClick="showTimePickerDialog" />

์‚ฌ์šฉ์ž๊ฐ€ ์ด ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ, ์‹œ์Šคํ…œ์€ ๋‹ค์Œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

fun showTimePickerDialog(v: View) {
    TimePickerFragment().show(supportFragmentManager, "timePicker")
}

์ด ๋ฉ”์†Œ๋“œ๋Š” ์œ„์— ์ •์˜๋œ DialogFragment์˜ ์ƒˆ ์ธ์Šคํ„ด์Šค์— show() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. show() ๋ฉ”์†Œ๋“œ์—์„œ๋Š” FragmentManager ์ธ์Šคํ„ด์Šค์™€ Fragment์— ๋Œ€ํ•œ ๊ณ ์œ ํ•œ ํƒœ๊ทธ ์ด๋ฆ„์ด ํ•„์š”ํ•˜๋‹ค.

Date Picker ๋งŒ๋“ค๊ธฐ

DatePickerDialog๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ TimePickerDialog๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. The only difference is the dialog you create for the fragment.

DialogFragment๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DatePickerDialog๋ฅผ ํ‘œ์‹œํ•˜๋ ค๋ฉด, DialogFragment๋ฅผ ์ƒ์†๋ฐ›๊ณ  DatePickerDialog๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” onCreateDialog() ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•œ ํ”„๋ž˜๊ทธ๋จผํŠธ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ด์•ผํ•œ๋‹ค.

Date Picker๋ฅผ ์œ„ํ•œ DialogFragment ์ƒ์† [^6]

DatePickerDialog๋ฅผ ์œ„ํ•œ DialogFragment๋ฅผ ์ •์˜ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • onCreateDialog() ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค. ์ด ๋ฉ”์†Œ๋“œ๋Š” DatePickerDialog์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋‚ ์งœ๋ฅผ ์„ค์ •ํ•  ๋•Œ ์ฝœ๋ฐฑ[^3]์„ ์ˆ˜์‹ ํ•˜๊ธฐ ์œ„ํ•ด DatePickerDialog.OnDateSetListener ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ(Kotlin):

class DatePickerFragment : DialogFragment(), DatePickerDialog.OnDateSetListener {

    override fun onCreateDialog(savedInstanceState: Bundle): Dialog {
        // Use the current date as the default date in the picker
        val c = Calendar.getInstance()
        val year = c.get(Calendar.YEAR)
        val month = c.get(Calendar.MONTH)
        val day = c.get(Calendar.DAY_OF_MONTH)

        // Create a new instance of DatePickerDialog and return it
        return DatePickerDialog(activity, this, year, month, day)
    }

    override fun onDateSet(view: DatePicker, year: Int, month: Int, day: Int) {
        // Do something with the date chosen by the user
    }
}

์ƒ์„ฑ์ž ์ธ์ˆ˜์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ DatePickerDialog ํด๋ž˜์Šค๋ฅผ ์ฐธ์กฐ.

์ด์ œ ํ”„๋ž˜๊ทธ๋จผํŠธ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์•กํ‹ฐ๋น„ํ‹ฐ์— ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค. [^4]

Date Picker ๋ณด์—ฌ์ฃผ๊ธฐ

์œ„์— ํ‘œ์‹œ๋œ ๊ฒƒ๊ณผ ๊ฐ™์€ DialogFragment๋ฅผ ์ •์˜ํ•œ ํ›„์—๋Š” DialogFragment ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  show() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ Date Picker๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜์˜ ์ฝ”๋“œ๋Š” ํด๋ฆญํ•˜๋ฉด Dialog๋ฅผ ํ‘œ์‹œํ•˜๋Š” ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฒ„ํŠผ์ด๋‹ค. [^5]

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/pick_date"
    android:onClick="showDatePickerDialog" />

์‚ฌ์šฉ์ž๊ฐ€ ์ด ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ, ์‹œ์Šคํ…œ์€ ๋‹ค์Œ ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

fun showDatePickerDialog(v: View) {
    val newFragment = DatePickerFragment()
    newFragment.show(supportFragmentManager, "datePicker")
}

์ด ๋ฉ”์†Œ๋“œ๋Š” ์œ„์— ์ •์˜๋œ DialogFragment์˜ ์ƒˆ ์ธ์Šคํ„ด์Šค์— show() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. show() ๋ฉ”์†Œ๋“œ์—์„œ๋Š” FragmentManager ์ธ์Šคํ„ด์Šค์™€ Fragment์— ๋Œ€ํ•œ ๊ณ ์œ ํ•œ ํƒœ๊ทธ ์ด๋ฆ„์ด ํ•„์š”ํ•˜๋‹ค.

[^1]: We recommend that you use DialogFragment to host each time or date picker. The DialogFragment manages the dialog lifecycle for you and allows you to display the pickers in different layout configurations, such as in a basic dialog on handsets or as an embedded part of the layout on large screens.
[^2]: Extending DialogFragment for a time picker
[^3]: 1.๋‹ค๋ฅธ ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ์จ ์ด์šฉ๋˜๋Š” ํ•จ์ˆ˜ 2.์–ด๋–ค ์ด๋ฒคํŠธ์— ์˜ํ•ด ํ˜ธ์ถœ๋˜์–ด์ง€๋Š” ํ•จ์ˆ˜
[^4]: Now all you need is an event that adds an instance of this fragment to your activity.
[^5]: For example, here's a button that, when clicked, calls a method to show the dialog:
[^6]: Extending DialogFragment for a date picker

๋ฐ˜์‘ํ˜•