경험의 기록

 

안드로이드 개발을 진행하다보면

사용자에게 선택지를 제공하기 위해 다이얼로그를 꽤나 자주사용하게 되는데

다이얼로그를 사용할 때마다 조금씩 헷갈릴 때가 있어 정리하고자 한다.

 

 


1️⃣ 일반 다이얼로그 띄우기

임의로 위와같은 레이아웃을 구성하여 다이얼로그에서 입력받은 결과를

텍스트뷰에 보여주려고 한다.

// 1. 일반 다이얼로그 띄우기
    private fun showDialog(){
        val builder = AlertDialog.Builder(this)
        builder
            .setTitle("타이틀입니다.")
            .setMessage("메세지입니다.")
            .setIcon(R.drawable.ic_launcher_foreground)
            .setPositiveButton("YES") { dialog , which ->
                // 기능구현
                binding.dialogText.text = "YES Click"
            }
            .setNegativeButton("NO"){ dialog, which ->
                // 기능구현
                binding.dialogText.text = "NO Click"
            }
            .create()
            .show()
    }

 

위와 같이 setTitle, SetMessage, SetIcon을 통해 제목, 내용, 아이콘을 지정하고

setPositiveButtonsetNegativeButton으로 버튼을 생성하여

각각 그 버튼 클릭 시 동작할 기능을 구현할 수 있다.

 

 

 

2️⃣ 커스텀 다이얼로그 띄우기

커스텀 다이얼로그를 띄우기 위해서는

원하는 모양의 xml 레이아웃과 Dialog 코드 작성이 필요하다.

위와 같은 화면을 띄우고 버튼 클릭 시 이벤트를 발생 시키려고 한다.

 

interface CustomDialogListener {
    fun onOkButtonClicked()
}

클릭 이벤트를 수신할 인터페이스 리스너를 작성해주고

 

class CustomDialog(context: Context, private val listener: CustomDialogListener): Dialog(context) {

    private lateinit var binding: DialogCustomBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = DataBindingUtil.inflate(
            LayoutInflater.from(context),
            R.layout.dialog_custom,
        null, false)

        setContentView(binding.root)

        binding.apply {
            // 버튼 클릭 시 리스너 메소드 호출
            button.setOnClickListener {
                listener.onOkButtonClicked()
            }
        }
    }
}

다이얼로그를 제어하기 위한 파일을 작성해준다. 여기서 리스너를 인자로 받아 버튼 클릭시

그 리스너의 메소드를 호출한다.

 

class MainActivity : AppCompatActivity(), CustomDialogListener {

	(..)

    // 2. 커스텀 다이얼로그 띄우기
    private fun customDialog(){
        val dialog = CustomDialog(this, this)
        dialog.show()
    }

    // 커스텀 다이얼로그에서 버튼 클릭 시
    override fun onOkButtonClicked() {
        // 기능 구현
        Toast.makeText(this, "버튼이 클릭되었습니다.", Toast.LENGTH_SHORT).show()
    }
}

이제 호출하는 부분에서 리스너를 상속받아 구현부를 작성해주고 show를 통해 호출해준다.

 

 

기능은 잘 작동하나 처음에 작성한 xml 레이아웃을 보면

더 큰 형태로 작성하였는데, 원하는 형태로 출력되지 않은 것을 확인할 수 있다.

 

사이즈 조절하기

fun Context.dialogResize(dialog: Dialog, width: Float, height: Float){
    val windowManager = getSystemService(Context.WINDOW_SERVICE) as WindowManager

    if (Build.VERSION.SDK_INT < 30){
        val display = windowManager.defaultDisplay
        val size = Point()

        display.getSize(size)

        val window = dialog.window

        val x = (size.x * width).toInt()
        val y = (size.y * height).toInt()

        window?.setLayout(x, y)

    }else{
        val rect = windowManager.currentWindowMetrics.bounds

        val window = dialog.window
        val x = (rect.width() * width).toInt()
        val y = (rect.height() * height).toInt()

        window?.setLayout(x, y)
    }
}

위와 같은 확장함수를 작성하면

다이얼로그의 크기를 임의로 조절할 수 있다.

API 30 미만의 버전에서는 getSize를 통해 사이즈를 얻어와 크기를 임의로 조절할 수 있는데

 

그 이상의 버전의 경우 deprecated 되었기 때문에

따로 분기처리하여 windowManager.currentWindowMetrics.bounds 를 통해

디바이스의 사이즈를 얻어와 크기를 조절한다.

이제 아까의 다이얼로그에서 임의의 값을 넣어 크기를 조절할 수 있다.

크게 잘 나오는 것을 확인할 수 있다.

하지만 원한 모양은 둥근 테두리의 레이아웃인데 이 또한 원하는 형태로 출력되지 않은 것을 확인할 수 있다.

 

 

배경 투명하게 바꾸기

// 배경 투명하게 바꿔줌
window!!.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))

다이얼로그의 onCreate 부분에 위 코드를 추가하여 배경색을 투명으로 변경해주면

원하는 다이얼로그 형태를 얻을 수 있다.

 

 

취소 불가능, 배경 제거

// 취소 불가능
setCancelable(false)

// 다이얼로그 배경 제거
window!!.setDimAmount(0f)

또한 위 메소드 들로 각각 취소가 불가능한 다이얼로그, 배경을 제거하는 기능을 구현할 수 있다.

 

 

https://github.com/HanYeop/AndroidStudio-Practice2/tree/master/DialogEx

 

GitHub - HanYeop/AndroidStudio-Practice2: (2021.05.20~) 안드로이드 학습 내용 저장소

(2021.05.20~) 안드로이드 학습 내용 저장소. Contribute to HanYeop/AndroidStudio-Practice2 development by creating an account on GitHub.

github.com

 

 

 

 

참고 

https://onlyfor-me-blog.tistory.com/136

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading