멜팅비의 개발 공부

[Android-Kotlin] FullScreen DialogFragment 구현하기(Progress Dialog) 본문

개발 공부/[Android 개발]

[Android-Kotlin] FullScreen DialogFragment 구현하기(Progress Dialog)

멜팅비 2021. 4. 6. 22:51
반응형

retrofit을 통해 네트워크 통신을 하는 경우 로딩을 구현하는 경우가 종종 있다.

ProgressBar Dialog 같은 경우 Full Screen으로 떠야 하는 경우들이 있는데 Full Screen으로 뜨도록 하기 위해 구글링을 자주 하는 것 같아서 정리도 할겸 포스팅하게 되었다.  (지금은 팝업 같은 경우 공통으로 사용하는 경우가 많아서 모듈화해서 사용한다.)


Full Screen Dialog를 만드는데 크게 2가지 방법을 사용하고 있다.

 

style.xml에 스타일을 정의해서 구현하는 경우

<style name="Theme.App" parent="Theme.MaterialComponents.Light.NoActionBar">
	...
	<item name="android:dialogTheme">@style/DialogTheme</item>
</style>

<style name="DialogTheme" parent="Theme.AppCompat.Light.Dialog">
	<item name="android:windowIsFloating">false</item>
	<item name="android:windowBackground">@android:color/transparent</item>
	<item name="android:statusBarColor">@color/white</item>
	<item name="android:backgroundDimEnabled">false</item>
</style>

📒android:windowIsFloating

true일 경우 Dialog가 자식요소 만큼만 view size를 가진다.

false일 경우 Dialog가 전체 화면을 사용한다.

 

📒android:windowBackground

Dialog 배경 색상 지정

 

📒android:statusBarColor

상태바 색상을 지정 ( Dialog가 뜰 때 상태바 색상이 기존에 앱에서 설정한 색상과 다르게 뜨는 경우가 있는데, 통일하고 싶을 때 설정해준다.)

 

📒android:backgroundDimEnabled 

ture일 경우 Dialog view 바깥쪽이 dim 처리가 된다.(불투명의 어두운 색상)

false일 경우 dim 처리를 하지 않는다.

 

📒android:windowFullscreen 

Dialog의 크기를 화면에 꽉 채우는데 true로 설정할 경우 상단 상태바가 없어지는 풀스크린 모드가 가능하다.

 

 

코드에서 구현하는 방법

 

class ProgressDialog(private val layoutResId: Int) : DialogFragment() {

    lateinit var dialogView: View

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
        dialogView = inflater.inflate(layoutResId, container, false)
        return dialogView
    }

    override fun onResume() {
        super.onResume()
        // full Screen code
        dialog?.window?.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)
        dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))
        dialog?.window?.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND)
    }
}

📒window.setLayout : Dialog View를 MATCH_PARENT 값을 주어 화면에 꽉차도록 한다.

 

📒window.setBackgroundDrawable : Dialog 배경색 지정

 

📒window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND) : dim 제거

 

주로 특정 Dialog만 Full Screen 모드로 적용하고 싶을 때 코드로 구현해서 사용하고 있다.
ProgressBar Dialog Class를 구현하고 로딩이 필요한 곳에서 show()를 통해 호출하고 있다.

 

private val progressDialog: ProgressDialog by lazy { ProgressDialog(R.layout.dialog_progress) }


if (!progressDialog.isAdded) {
	progressDialog.show(requireActivity().supportFragmentManager, null)
}

if (progressDialog.isAdded) {
	progressDialog.dismiss()
}

Activity 위에 Dialog가 FullScreen으로 뜨는 것을 볼 수 있다. 

 

반응형
Comments