근래 JetPack Compose 로 개발을 주로 하던 중 문득 이전 프로젝트(xml 구현)의 커스텀 다이얼로그 구현을 할 일이 있어 공유를 해보려고합니다.
제가 구현한 다이얼로그는 기본 2버튼(확인 / 취소)과 Title을 포함한 다이얼로그 입니다.
@SuppressLint("InflateParams")
class CustomDialogBuilder(private val context: Context) {
private val view by lazy {
LayoutInflater.from(context).inflate(R.layout.custom_dialog, null)
}
private val dialog by lazy {
AlertDialog.Builder(context).setView(view).create()
}
private lateinit var btnConfirm: Button
private lateinit var btnCancel: Button
private lateinit var textTitle: TextView
init {
dialog.apply {
setCancelable(false)
window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
}
}
fun initView(confirmButtonId: Int, cancelBtnId: Int, textTitleId: Int) {
btnConfirm = view.findViewById(confirmButtonId)
btnCancel = view.findViewById(cancelBtnId)
textTitle = view.findViewById(textTitleId)
}
fun setViewText(titleText: String, confirmBtnText: String, cancelBtnText: String) {
textTitle.text = titleText
btnConfirm.text = confirmBtnText
btnCancel.text = cancelBtnText
}
fun clickConfirm(confirmClickListener: (View) -> Unit) {
btnConfirm.setOnClickListener {
confirmClickListener(it)
dialog.dismiss()
}
}
fun clickCancel(cancelClickListener: (View) -> Unit) {
btnCancel.setOnClickListener {
cancelClickListener(it)
dialog.dismiss()
}
}
fun showDialog() = dialog.show()
}
저는 CustomDialog 라는 유틸 클래스를 만들고,아래와 같이 Extension으로 관리하고있습니다.
fun Context.customDialog(
titleText: String,
confirmBtnText: String = getString(R.string.confirm),
cancelBtnText: String = getString(R.string.cancel),
clickCancel: (View) -> Unit = {},
clickConfirm: (View) -> Unit
): CustomDialogBuilder = CustomDialogBuilder(this).apply {
initView(R.id.btn_confirm, R.id.btn_cancel, R.id.text_title)
setViewText(titleText, confirmBtnText, cancelBtnText)
clickCancel(clickCancel)
clickConfirm(clickConfirm)
showDialog()
}
Extension을 사용하는 이유에 대해 질문을 받았었는데, 그 이유로는 버튼이 하나일 경우 혹은 추가 contentText 등이 추가되는 경우에 Custom class에 변화가 생기더라도 뷰에대한 초기화를 Extension에서 하여 확장 관리가 용이하도록 위함입니다.
저는 위 코드를 토대로 저는 아래와 같은 경우에 맞게 사용하고있습니다.
1. 버튼2개(확인/취소) 및 TitleText
2. 버튼2개(확인/취소) 및 TitleText + ContentText
3. 버튼1개(확인) 및 TitleText + ContentText
이견이 있으시다면 편하게 얘기해 주시기 바랍니다.
감사합니다 :)