몰?.루();

안드로이드 kotlin AlertDialog 정리 본문

프로그래밍/안드로이드, 코틀린

안드로이드 kotlin AlertDialog 정리

toonraon 2022. 1. 9. 14:13

이런 게 AlertDialog입니다. 흔히 '대화상자'라고 많이 표현합니다.

Dialog 아래에 AlertDialog를 포함하여 DatePickerDialog, TimePickerDialog 같은 게 있습니다.

 

AlertDialog는 위의 사진처럼 단순한 대화상자를 띄우기에 좋은 클래스입니다.

DatePickerDialog는 날짜를 지정해야하는 대화상자를 띄우기에 좋고

TimePickerDialog는 시간을 지정해야하는 대화상자에 띄우기 좋다. 알람앱 그런 곳에서 많이 쓸 거 같습니다.

 

Dialog는 가장 최상위의 클래스이지만 구글 문서에 따르면 Dialog를 직접 인스턴스화 하는 것은 하지말라고 합니다.

AlertDialog를 쓰거나, 자신의 커스텀 다이얼로그를 만들 때만 Dialog를 상속해서 쓰라고 만들어 놓은 것 같습니다.

 

// MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val builder = AlertDialog.Builder(this)
        builder.setTitle("제목을 정하는 건 항상 어려워")
        builder.setMessage("내용 음슴!")
        builder.setPositiveButton("넹", DialogInterface.OnClickListener { dialog, which ->
            Toast.makeText(this, "넹!", Toast.LENGTH_SHORT).show()
        })
        builder.setNegativeButton("아니용", DialogInterface.OnClickListener { dialog, which ->
            Toast.makeText(this, "아니용!", Toast.LENGTH_SHORT).show()
        })
        builder.setNeutralButton("몰?루", DialogInterface.OnClickListener { dialog, which ->
            Toast.makeText(this, "몰?루!", Toast.LENGTH_SHORT).show()
        })
        builder.create()
        builder.show()
    }
}

끝이다. 이렇게하면 위의 사진처럼 다이얼로그가 뜨고, 다이얼로그의 버튼을 클릭하면

이런 식으로 Toast가 뜹니다.

구글 공식 문서는 이게 너무 쓸데 없고 복잡하게 설명되어있는 경향이 있습니다.

 

AlertDialog는 버튼을 3개까지 지정할 수 있습니다.

'넹'이 setPositiveButton으로 설정한 것이고

'아니용'이 setNegativeButton,

'몰?루'가 setNeutralButton으로 설정한 것입니다.

각각 긍정, 부정, 중립의 답변에 대한 버튼 역할들을 지정하는 것인데

물론 어디까지나 setPositiveButton은 구글이 정해놓은 이름일 뿐이므로 쌩까고 그냥 setPositiveButton에 '아니요'로 지정하고 클릭했을 때 동작도 다이얼로그를 그냥 끈다든지 할 수 있습니다. 

물론 그렇게 해놓으면 구글이보면 코드 누가 이딴 식으로 작성했냐고 뭐라고 하겠지만.

 

하지만 실제로 긍정 버튼이 오른쪽에 있는 게 마음에 들지 않는 경우 setPositiveButton과 setNegativeButton을 일부러 바꿔서 설정하는 경우도 있습니다. 물론 UX 일관성을 해치므로 추천하진 않습니다.

 

그리고 코드를 보면 builder.뭐시기뭐시기 이렇게 시작하는 코드가 상당히 많아서 코틀린에 익숙한 사람들은 저걸 .apply{}로 묶어버리고 싶은 욕구가 생길텐데

코드가 깔끔해지지만 makeText()가 오류납니다. 왜냐하면 context에 들어가는 파라미터가 this이기 때문인데 .apply{}로 묶는 순간 위의 사진에서 오른쪽 위에도 나와있지만 this가 더이상 MainActivity가 아니라 AlertDialog.Builder가 되어버리기 때문입니다.

 

// MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val builder = AlertDialog.Builder(this).apply {
            setTitle("제목을 정하는 건 항상 어려워")
            setMessage("내용 음슴!")
            setPositiveButton("넹", DialogInterface.OnClickListener { dialog, which ->
                Toast.makeText(this.context, "넹!", Toast.LENGTH_SHORT).show()
            })
            setNegativeButton("아니용", DialogInterface.OnClickListener { dialog, which ->
                Toast.makeText(this.context, "아니용!", Toast.LENGTH_SHORT).show()
            })
            setNeutralButton("몰?루", DialogInterface.OnClickListener { dialog, which ->
                Toast.makeText(this.context, "몰?루!", Toast.LENGTH_SHORT).show()
            })
            create()
            show()
        }
    }
}

AlertDialog.Builder는 context를 따로 가지고 있기 때문에 apply로 묶었을 경우

this.context로 context를 넘겨주면 오류가 사라집니다.

위의 코드보단 아래의 코드가 깔끔하고 좋은 듯...?

Comments