안드로이드 세계

[Android] 다이얼로그 크기조절하기(Dialog or Dialog Fragment Resize) 본문

안드로이드(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아래에 작성을 하여야 정상적으로 동작한다.

Comments