Android 다이얼로그 1 : 토스트 메시지, 시간, 날짜 입력받기

timothy jeong·2021년 11월 4일
0

Android with Kotlin

목록 보기
15/69
post-thumbnail

다이얼로그란 사용자와 상호 작용하는 대화상자이다. 대표적으로 사용되는 다이얼로그로는 토스트가 있고, 날짜 또는 시간 입력, 알림 창 등이 있다. 그 외에 다양한 다이얼로그가 있으며, 개발자가 직접 구성하는 커스텀 다이얼로그도 있다.

토스트 메시지

public static Toast makeText (Context context, 
                CharSequence text, 
                int duration)

두번째 매개변수가 메시지이며, 세번째 매개변수는 토스트가 화면에 출력되는 시간으로 보통은 Toast.LENGTH_SHORT(3초), Toast.LENGTH_LONG(5초) 이라는 상수를 이용한다.

만들어진 Toast 메시지에 show() 함수를 호출해서 화면에 출력한다.

val toast = Toast.makeText(this, "Hello", Toast.LENGTH_SHORT)
toast.show()

이렇게 makeText() 함수 외에 세터 함수를 통해 토스트 메시지를 만들 수도 있다.

fun setDuration(duration: Int): Unit
fun setText(redId: Int): Unit

// 토스트가 뜨는 위치 조정
fun setGravvity(gravity: Int, xOffset: Int, yOffset: Int): Unit
fun setMargin(horizontalMargin: Float, verticalMargin: Float): Unit


// 실제로 적용해보면 아래처럼 코딩 가능 (사실 text Toast 에는 setGravity, setMargin 이 적용되면 안됨)

val toast = Toast(this)
toast.setText("Hello")
toast.duration = Toast.LENGTH_SHORT
toast.setMargin(10.0F, 10.0F)
toast.setGravity(10, 10 ,10)

토스트 콜백

토스트 메시지가 화면에 보이거나, 사라지는 순간을 콜백으로 감지해 특정 로직을 수행하게 할 수도 있다.

토스트 메시지에 콜백을 더하는 메서드는 아래와 같으며, 매개변수로 들어가는 Toast.Callback 은 onToastShown(), void onToastHidden() 를 구현해야하는 추상 클래스이다.

public void addCallback (Toast.Callback callback)

 public abstract static class Callback {
        public void onToastShown() {}

        public void onToastHidden() {}
    }

Java Static Class 가 좀 헷갈린다. 하나의 클래스로만 존재해서 싱글톤 패턴처럼 되버린다면 토스트 메시지마다 동일한 callback 이 등록되는건 아닐까? 우선 그런건 아닌다.
static class 는 오로지 class 내부에 class 로서 선언이 가능하며, outer class 와는 어떠한 상호작용이 없어야 한다. static class 내부의 프로퍼티와 메서드는 outer class 에 대한 선언 없이도 접근할 수 있다.
Java static class 내용

토스트 메시지에 대한 콜백을 구현해보면, 추상 class 를 CallbackImpl 처럼 따로 구현하고 인자로 넣는 방식과, addCallback() 을 쓰면서 동시에 매개변수를 구현하는 방법이 있다. 코드 규모가 커지면 클래스를 따로 정의해서 사용하는게 좋아 보인다.

@RequiresApi(Build.VERSION_CODES.R)
class CallbackImpl : Toast.Callback() {
    override fun onToastShown() {
        super.onToastShown()
        Log.d("Info", "Toast Message Shown")
    }

    override fun onToastHidden() {
        super.onToastHidden()
        Log.d("Info", "Toast Message Hidden")
    }
}

....

fun originalToast(context: Context) {
    val toast = Toast.makeText(context, "Hello Original", Toast.LENGTH_SHORT)
    
    // 추상 Class 를 따로 정의
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) toast.addCallback(CallbackImpl())

    // 함수 안에서 바로 추상 Class 정의
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        toast.addCallback(object : Toast.Callback() {
            override fun onToastShown() {
                super.onToastShown()
            }

            override fun onToastHidden() {
                super.onToastHidden()
            }
        })
    }
    toast.show()
}

날짜 또는 시간 입력 받기

앱에서 사용자에게 날짜나 시간을 입력받는 데 사용하는 다이얼로그를 피커(Picker) 다이얼로그라고 한다. 날짜를 입력받을 때는 데이트 피커 다이얼로그, 시간을 입력받을 때는 타임 피커 다이얼로그를 사용한다.

날짜 입력 받기

// 원형

DatePickerDialog(context: Context, listener: OnDateSetListener,
year: Int, month: Int, dayOfMonth: Int) {...}


// 구현
  button.setOnClickListener {
            DatePickerDialog(this, object :DatePickerDialog.OnDateSetListener{
                override fun onDateSet(view: DatePicker?, year: Int, month: Int, dayOfMonth: Int) {
                    Log.d("gg","Yeear : $year , Month : $month , Day of Month : $dayOfMonth " )
                }
            }, 2021, 11, 4).show()
        }

날짜 다이얼로그는 이렇게 뜨고, 저 OK 를 누르면 해당 값이 입력된다.

시간 입력 받기

button2.setOnClickListener {
            TimePickerDialog(this, object :TimePickerDialog.OnTimeSetListener {
                override fun onTimeSet(view: TimePicker?, hourOfDay: Int, minute: Int) {
                    Log.d("gg", "hourOfDay : $hourOfDay , minute : $minute" )
                }
            }, 15, 0, true).show()
        }

profile
개발자

0개의 댓글