Android Custom Dialog

psb·2025년 3월 8일

custom view

목록 보기
1/1

근래 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

이견이 있으시다면 편하게 얘기해 주시기 바랍니다.
감사합니다 :)

profile
Android Developer 안다고 생각하는 것을 의심하자...

0개의 댓글