안드로이드(Android)/코틀린(Kotlin)
[Android] 다이얼로그 크기조절하기(Dialog or Dialog Fragment Resize)
리안94
2021. 1. 11. 19:37
커스텀 다이얼로그를 사용하다가 보면 원하는 크기대로 다이얼로그가 생성되지 않는다.
아래의 내용은 해당 커스텀 다이얼로그를 디바이스 크기 비율로 조절하는 법이다.
- 다이얼로그 프래그먼트
fun dialogFragmentResize(context: Context, dialogFragment: DialogFragment, width: Float, height: Float) {
val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
if (Build.VERSION.SDK_INT < 30) {
val display = windowManager.defaultDisplay
val size = Point()
display.getSize(size)
val window = dialogFragment.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 = dialogFragment.dialog?.window
val x = (rect.width() * width).toInt()
val y = (rect.height() * height).toInt()
window?.setLayout(x, y)
}
}
- 다이얼로그
fun dialogResize(context: Context, dialog: Dialog, width: Float, height: Float){
val windowManager = context.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)
}
}
위의 방법으로 context를 매개변수로 받아와서 사용하여도 좋지만 확장 함수를 이용하게 된다면 더욱 편하게 작성할 수 있다.
- 다이얼로그 프래그먼트
fun Context.dialogFragmentResize(dialogFragment: DialogFragment, 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 = dialogFragment.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 = dialogFragment.dialog?.window
val x = (rect.width() * width).toInt()
val y = (rect.height() * height).toInt()
window?.setLayout(x, y)
}
}
- 다이얼로그
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)
}
}
사용할 때에는 다음과 같이 사용하면 된다.(확장 함수로 만들었다는 가정을 한다.)
- 다이얼로그 프래그먼트
class CustomDialogFragment : DialogFragment() {
override fun onResume() {
super.onResume()
context?.dialogFragmentResize(this@CustomDialogFragment, 0.9f, 0.9f)
}
}
- 다이얼로그
class CustomDialog(context: Context): Dialog(context) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
context.dialogResize(this@CustomDialog, 0.9f, 0.9f)
}
}
디바이스의 가로 세로의 90%를 차지한 다이얼로그가 생성된다.
※ 다이얼로그 리사이즈 시 setContentView아래에 작성을 하여야 정상적으로 동작한다.