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

[Kotlin] 전체화면으로 DialogFragment 열기

by Youngs_ 2021. 12. 13.

DialogFragment 여는 코드

SomethingDialog().showNow(supportFragmentManager,"")

DialogFragment의 코드

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

    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        
        // 처리

        return binding.root
    }

    override fun onResume() {
        super.onResume()
        //전체화면으로 만드는 코드
        dialog?.window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
        dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.WHITE))
        dialog?.window?.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
    }
}

 


 

/* 
    아래 코드는 예시일뿐, 아래 코드를 이용해 적절히 사용하자
    사용자가 두번 연속으로 누르면 프래그먼트가 두번 열리는데 그걸 방지하는 코드인듯..?
    프래그먼트의 BackStack에 관해 알고있으면 좋을듯하다. 하단에 참고하면 좋을만한 포스팅 링크를 남겨놓는다.
*/

val fragmentClass = fragmentClass()

changeFragment(activity, fragmentClass)

fun changeFragment(
        activity: FragmentActivity,
        fragment: Fragment
    ) {
        
            val backStateName = fragment.requireArguments().getString("name")
            val fragmentManager = requireActivity().supportFragmentManager
            val fragmentTransaction = fragmentManager.beginTransaction()
            
            fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
            
            fragment.arguments = bundle
            val backStackEntryCount = fragmentManager.backStackEntryCount
            if (backStackEntryCount > 0) { //프래그먼트가 1개이상 존재할 경우
                val backStackEntry = fragmentManager.getBackStackEntryAt(backStackEntryCount - 1)
                val beforeBackStackName = backStackEntry.name
                //이전 백스택과 현재 백스텍이 동일하다면 백스택을 추가하지않고, 동일하지 않다면 추가한다. (중복 스택생성 방지)
                if (backStateName != beforeBackStackName) {
                    fragmentTransaction.replace(R.id.content_frame, fragment) // content_frame은 XML의 FrameLayout
                    fragmentTransaction.addToBackStack(backStateName)
                }
            } else { //최초 프래그먼트 세팅시
                fragmentTransaction.replace(R.id.content_frame, fragment)
                fragmentTransaction.addToBackStack(backStateName)
            }
            fragmentTransaction.commit()        
    }
}

 

BackStack에 대해 참고 하면 좋을만한 포스팅

https://hwanine.github.io/android/backstack2/

 

Android - 프래그먼트 생애주기 백 스택 관리 (Kotlin)

프래그먼트 백 스택 관리

hwanine.github.io

 

댓글