Android FullScreen을 Kotlin으로 구현하는 꿀팁

2021. 4. 27. 19:16개발을 파헤치다/Android

반응형

Android 앱 개발을 하면 FullScreen을 한 번쯤은 만들게 되는데요.

가장 흔하게는 처음 서비스 로고가 뜨는 스플래쉬 화면이 될 수 있고 게임 개발 시에도 사용하게 됩니다.

Java로 Android FullScreen을 구현한 예제는 참 많이 찾아볼 수 있는데 Kotlin으로 적용한 예제가 상대적으로 없더군요.

또, Android 11(R)에 대응하는 예제가 거의 없었어요. 곧 SYSTEM_UI_FLAG_FULLSCREEN이 사라질 예정이거든요(API Level 30부터 Deprecated). 진정한 Android 개발자라면 새로운 업데이트에 대응할 수 있어야겠죠?

오늘은 이 두 가지를 모두 만족하는 예제를 알려드리겠습니다.

예상보다 더 힘겹게, 여러 문서를 보고 찾은거라 분명히 도움되시리라 생각합니다.

 

새롭게 대응해야 할 때가 왔네요...

Android 11(R)부터는 SystemUiVisibility를 사용하여 FullScreen 모드를 적용하지 않습니다.

대신 Window Insets Controller를 활용해서 구현해야 합니다.

 

 

class SplashActivity : AppComaptActivity(){
	override fun onCreate(savedInstanceState: Bundle?){
    	super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)
        // 전체화면으로 만드는 메서드 호출
        setFullScreen()
    }
    
    fun setFullScreen(){
    	// Android 11(R) 대응
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES>R){
        	// 상단 Action Bar를 사라지게한다
            supportActionBar?.hide()
            
            // 이 값이 True이면 내부적으로 SYSTEM UI LAYOUT FLAG 값들을 살펴보고
            // 해당 설정값들을 토대로 화면을 구성하게 된다.
            // 따라서 False로 설정을 해주어야 이제 사라질(Deprecated) Flag 값들을
            // 무시하고 Window Insets를 통해 화면을 구성하게 된다
            window.setDecorFitsSystemWindwos(false)
            val controller = windwo.insetsController
            if (controller != null){
            	// 상태바와 네비게이션을 사라지게 한다
                controller.hide(WindowInsets.Type.statusBars() or
                	WindowInsets.Type.navigationBars())
                // 특정 행동(화면 끝을 스와이프하는 등)을 했을 때에만 시스템바가 나타나도록 설정
                controller.systemBarBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
            }
        }
        // R 버전 이하 대응
        else{
            // Action Bar 숨기지 않으면 뜨는 경우가 있다
            supportActionBar?.hide()
            // 전체화면 적용
           window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE
                    // 컨텐츠를 시스템바 밑에 보이도록한다.
                    // 시스템바가 숨겨지거나 보여질 때 컨텐츠 부분이 리사이징 되는 것을 막기 위함
                    or View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    // 네비게이션과 상태바를 사라지게하기
                    or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    or View.SYSTEM_UI_FLAG_FULLSCREEN)
        }
    }
}

 

자세한 설명은 주석에 다 달려있으니 참고하시면 될 것 같네요.

혹시라도 설명이 이해가 안간다거나 더 궁금한 점이 있다면

망설이지 말고 여기로 언제든 물어봐주세요. 

기쁜 마음으로 답변 드리겠습니다 :)

 

반응형