ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [UI] AlertDialog
    카테고리 없음 2021. 11. 29. 17:02
    • AlertDialog

    Dialog#show() - 표시

    Dialog#hide() - 숨김

    AppCompatDialog#dismiss() -무시

     

    • AlertDialog.Builder

    다이얼로그 셋팅후 create()로 생성

    setTitle - 제목

    setMessage - 부제목

     

    참고

    위의 클래스 대신 매티리얼 디자인의 빌더인 MaterialAlertDialogBuilder를 통해 AlertDialog를 생성할 수 있다.

    MaterialAlertDialogBuilder 역시 androidx AlertDialog타입으로 생성한다.


    제목과 부제목

     

    mAlertDialog = AlertDialog.Builder(this).setTitle("제목").create() 
     //버튼 mAlertDialog.show()

     

     mAlertDialog = AlertDialog.Builder(this).setTitle("제목").setMessage("부제목").create()
     //버튼 mAlertDialog.show()

     


    Neutral , Negative, Positive 버튼

     

    mAlertDialog = AlertDialog.Builder(this).setTitle("제목").setMessage("부제목")
    .setNeutralButton("중립", object : DialogInterface.OnClickListener {
        override fun onClick(dialog: DialogInterface, which: Int) {
            log("중립") //내가 정의한 Log.d 메서드
        }
    }).setNegativeButton("부정", object : DialogInterface.OnClickListener {
        override fun onClick(dialog: DialogInterface, which: Int) {
            log("부정")
        }
    }).setPositiveButton("긍정", object : DialogInterface.OnClickListener {
        override fun onClick(dialog: DialogInterface, which: Int) {
            log("긍정")
        }
    }).create()
    
    //버튼 mAlertDialog.show()

    빌더의 메서드로 중립,부정,긍정 버튼을 설정하고, 각 버튼이 눌렸을 때 호출될 인터페이스 구현 객체를 넣는다.

     

    DialogInterface.OnClickListener

     

    onClick의 인자를 활용할 수 있기 때문에 위에 처럼 버튼마다 따로 객체를 구현하여 전달할 필요가 없다.

    DialogInterface 참조변수는 실제 버튼이 클릭된 구현 객체이다.

    Int형 변수의 값은 DialogInterface의 상수로 어떤 버튼이 눌렸는지 확인할 수 있다.

     

    DialogInterface의 상수

    import android.app.TimePickerDialog
    import android.content.DialogInterface
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import android.util.Log
    import android.view.View
    import androidx.appcompat.app.AlertDialog
    
    class MainActivity : AppCompatActivity() {
    
        private lateinit var mAlertDialog: AlertDialog
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            val onClickImple: DialogInterface.OnClickListener =
                object : DialogInterface.OnClickListener {
                    override fun onClick(dialogInterface: DialogInterface?, which: Int) {
                        //인터페이스를 통한 다형성 -> 구현한 것중 하나
                        if (dialogInterface is AlertDialog) {
                            log("클릭된 것이 AlertDialog 입니다")
                        }
                        if (dialogInterface is TimePickerDialog) {
                            log("클릭된 것이 TimePickerDialog 입니다")
                        }
                        when (which) {
                            DialogInterface.BUTTON_NEUTRAL -> {
                                log("중립 버튼 눌림")
                            }
                            DialogInterface.BUTTON_NEGATIVE -> {
                                log("부정 버튼 눌림")
                            }
                            DialogInterface.BUTTON_POSITIVE -> {
                                log("긍정 버튼 눌림")
                            }
                        }
                    }
                }
    
            mAlertDialog = AlertDialog.Builder(this).setTitle("제목").setMessage("부제목")
                .setNeutralButton("중립", onClickImple)
                .setNegativeButton("부정", onClickImple)
                .setPositiveButton("긍정", onClickImple)
                .create()
    
        }
    
        fun onClick(view: View) {
            when (view.id) {
                R.id.button -> {
                    mAlertDialog.show()
                }
            }
        }
    
        private fun log(str: String) {
            Log.d("AlertDialog", str)
        }
    }

    결과는 이전과 동일하다.


    cancel 과 dismiss

    dismiss

    다이얼로그의 작업이 수행되고 종료될 때

     

    cancel

    사용자가 버튼을 누르지 않고 취소한 경우

    (back 버튼, 다이얼로그 바깥에서 터치를 시작해서 다이얼로그 바깥에서 터치를 뗌)

     

    버튼을 통해 종료 - dismiss 리스너 메서드 호출

    취소 또는 바깥 터치로 종료 - cancel 리스너 메서드 호출 -> dismiss 리스너 메서드 호출

     

    밑의 코드에서 구현 객체를 귀찮아서 람다식으로 작성하였다. 각 리스너 메서드 참고

    바로 전의 코드에서 AlertDialog 생성만 다음과 같이 바꾼다.

    //달라진 부분만 작성
    mAlertDialog = AlertDialog.Builder(this).setTitle("제목").setMessage("부제목")
                .setNeutralButton("중립", onClickImple)
                .setNegativeButton("부정", onClickImple)
                .setPositiveButton("긍정", onClickImple)
                .setOnDismissListener { dialogInterface -> log("종료됨") }
                .setOnCancelListener { dialogInterface -> log("취소됨") }
                .create()

    사용자가 버튼을 누르지 않고 취소한 경우

    사용자가 Positive 버튼을 눌러 취소한 경우

     

     

    댓글

Designed by Tistory.