// 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을 통해 제목, 내용, 아이콘을 지정하고
setPositiveButton과 setNegativeButton으로 버튼을 생성하여
각각 그 버튼 클릭 시 동작할 기능을 구현할 수 있다.
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)
또한 위 메소드 들로 각각 취소가 불가능한 다이얼로그, 배경을 제거하는 기능을 구현할 수 있다.