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