본문 바로가기
프로그래밍/Android

[Android] 커스텀 다이얼로그를 열때 Bundle로 값을 넘겨주기

by Youngs_ 2022. 9. 2.
열려는 다이얼로그 클래스는 반드시 DialogFragment를 상속해야한다!!

 

먼저 다이얼로그를 화면가득찬 상태로 만들기 위해 style.xml에 테마를 만든다

styles.xml

<style name="FullDialogTheme" parent="AppTheme">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowFullscreen">false</item>
    <item name="android:windowIsFloating">false</item>
</style>

 

DialogClass라는 DialogFragment를 상속하는 클래스를 열때 특정 값을 넘겨줘야하는 경우가 생긴다.

이럴때 DialogClass안에 public으로 변수를 생성한 후에 DialogClass().let안에 [it.변수명 = "test"]와 특정값을 넣어 사용할수있지만 public으로 사용하는것은 효율적이지도 않고 번거롭다.
필자는 bundle을 이용해 넘기는법을 몰랐을때 해당 방식을 사용했는데 불편하더라.. 무엇보다 가끔 it.변수명 안에 값이 안들어갈때가 있더라 -> 이건 왜이런지 모르겠다..

이럴때는 bundle을 이용해서 argument를 넘겨준 후에 DialogClass 안에서 넘겨준 인자값을 사용하면된다.

// 전체화면으로 열기
DialogClass().let{
    val bundle = Bundle()
    bundle.putString("key", "value")

    it.arguments = bundle

    it.setStyle(DialogFragment.STYLE_NORMAL, R.style.FullDialogTheme)
    it.dialog?.window?.setWindowAnimations(android.R.style.Animation_Dialog)

    it.showNow(supportFragmentManager,"")
}

 

Dialog를 전체화면으로 여는게 아니라 frameLayout부분만 변경하도록 할때는 아래 코드를 사용하면된다.

아래 Setting()클래스는 DialogFragment()가 아니라 Fragment()를 상속한다.

binding.bottomNavigationview.setOnItemSelectedListener { item ->
            when (item.itemId) {
                R.id.setting->{
                    Setting().let {
                        val bundle = Bundle()
                        bundle.putString("key", "값")
                        it.arguments = bundle
                        supportFragmentManager.beginTransaction()
                            .replace(binding.frameLayoutActivityMain.id, it).commit()
                    }
                }
                else -> {
                    supportFragmentManager.beginTransaction()
                        .replace(binding.frameLayoutActivityMain.id, Setting()).commit()

                }
            }
            true
        }

 

넘겨준 값을 사용할때는 아래와같이 사용하면된다.

arguments?.getString("key")

 

댓글