AlertDialog에서 message의 View를 얻고 싶습니다.

소개



Android의 AlertDialog를 사용하는 경우 메시지의 View를 얻고 싶을 수 있습니다.
검색하면 AlertDialog를 그대로 사용하는 패턴으로 message의 TextView를 얻는 방법이 나옵니다.
이런 식으로 ↓
val builder = AlertDialog.Builder(context).apply {
    setMessage(message)
}
val dialog = builder.show()
val messageView = dialog.findViewById<TextView>(android.R.id.message)

그러나 대화 에 의하면 AlertDialog는 DialogFragment로 감싸는 것이 추천되고 있어 AlertDialog를 그대로 show() 하는 장면은 그다지 많지 않다고 생각합니다 (적어도 내가 속한 프로젝트에서는).
샘플은 다음과 같습니다 ( 대화에서 발췌).
class FireMissilesDialogFragment : DialogFragment() {

    override fun onCreateDialog(savedInstanceState: Bundle): Dialog {
        return activity?.let {
            // Use the Builder class for convenient dialog construction
            val builder = AlertDialog.Builder(it)
            builder.setMessage(R.string.dialog_fire_missiles)
                    .setPositiveButton(R.string.fire,
                            DialogInterface.OnClickListener { dialog, id ->
                                // FIRE ZE MISSILES!
                            })
                    .setNegativeButton(R.string.cancel,
                            DialogInterface.OnClickListener { dialog, id ->
                                // User cancelled the dialog
                            })
            // Create the AlertDialog object and return it
            builder.create()
        } ?: throw IllegalStateException("Activity cannot be null")
    }
}

문제점



이 경우 어떻게 메시지의 TextView를 얻을 수 있습니까?
DialogFragment의 show 메소드는 void이므로 처음에 언급한 방식으로 show 후에 AlertDialog를 얻을 수 없습니다. DialogFragment의 인스턴스에서 getDialog()하고 findViewById를 시도해도 getDialog가 null을 반환하는 것 같습니다.
그럼 어떻게 할까.

결론



DialogFragment onStart 에서 findViewById.
class MyDialog: DialogFragment() {

    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
        return activity?.let {
            AlertDialog
                .Builder(it)
                .setMessage("メッセージ")
                .setPositiveButton("OK", null)
                .create()
        } ?: throw IllegalStateException("Activity cannot be null")
    }

    override fun onStart() {
        super.onStart()
        val textView = (dialog as? AlertDialog)?.findViewById<TextView>(android.R.id.message)
        // 色を変える
        textView?.setTextColor(Color.BLUE)
        // 文字サイズを変える
        textView?.textSize = 40f
    }
}

안전하게 문자의 색상과 크기를 변경할 수있었습니다.

좋은 웹페이지 즐겨찾기