will come true

[Android/Kotlin] 액티비티 전체화면 설정하기, 관련 함수 설명 본문

Android

[Android/Kotlin] 액티비티 전체화면 설정하기, 관련 함수 설명

haehyun 2022. 1. 19. 23:43

화면 위에 시계, 배터리 등이 포함된 상태바와 애플리케이션 제목이 적힌 액션바를 숨기고, 액티비티 내용만을 전체화면으로 표시할 수 있다.

1. 액션바 숨기기

액션바가 출력되지 않도록 themes.xml 파일에서 액티비티에 적용되는 테마를 NoActionBar 등으로 지정한다.

[res] > [values] > [themes] > [themes.xml]

<resources xmlns:tools="http://schemas.android.com/tools">
    <style name="Theme.AndroidLab" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    	<!-- 생략 -->
    </style>
</resources>

 

2. 전체화면 출력 설정

액티비티 코드에서 전체화면으로 출력되게 설정한다. API 레벨 30부터 액티비티 창 설정 방법이 변경됐기 때문에 앱 버전 호환성을 고려해서 코드를 작성해줘야 한다. (사용자 스마트폰의 버전에 상관없이 앱이 정상적으로 작동해야 함)

  • API 레벨 30 (R버전) 이상 - WindowInsetsController 클래스 함수 사용
  • API 레벨 30 (R버전) 미만 - window.setFlags() 함수, WindowManager.LayoutParams.FLAG_FULLSCREEN 등 상수 사용

[MainActivity.kt]

package com.example.androidlab

import android.os.Build
import android.os.Bundle
import android.view.WindowInsets
import android.view.WindowInsetsController
import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity
import com.example.androidlab.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        // 버전 체크
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            // 데코 뷰를 루트 뷰에 맞추지 않음
            window.setDecorFitsSystemWindows(false)
            // WindowInsetsController
            val controller = window.insetsController
            if (controller != null) {
                // 상태바, 네비게이션바 숨기기
                controller.hide(WindowInsets.Type.statusBars() or WindowInsets.Type.navigationBars())
                // 스와이프 시 상태바 일시적으로 나타나도록 설정
                controller.systemBarsBehavior = WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
            }
        } else {
            window.setFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN
            )
        }
   }
}

 

위와 같이 설정하면 해당 액티비티가 전체화면으로 표시될 것이다. 아래는 위 코드에서 사용된 클래스, 함수, 필드에 대한 상세 설명이다. 영문을 보고 번역한 것이기 때문에 틀린 부분이 있을수도 있음.


코드 기능 설명

Build 클래스

class Build 시스템 속성에서 추출한 현재 빌드에 대한 정보
class Build.Partition 특정 장치 파티션에 대해 정보 빌드
class Build.VERSION 여러가지 버전 문자열들
public static final int Build.VERSION.SDK_INT 이 디바이스에서 현재 실행중인 소프트웨어의 SDK 버전
class Build.VERSION_CODES 현재 알려진 SDK 버전 코드들 열거형(상수 모음)
public static final int Build.VERSION_CODES.R R 버전 (API 30 레벨)
public static final int Build.VERSION_CODES.O Oreo 버전 (API 26 레벨)

 

Window 클래스

window : getWindow() 프로퍼티, Activity의 현재 Window에 접근한다.

abstract class Window  
public void .setDecorFitsSystemWindows(decorFitsSystemWindows : Boolean) 데코 뷰가 WindowInsets의 루트 콘텐츠 뷰에 맞아야 하는지 여부 설정
public WindowInsetController .window.insetsController getInsetsControllers() 프로퍼티, 해당 Window의 WindowInsetController를 반환한다.
public void .setFlags(flags: Int, mask: Int)  

 

WindowInsetsController 인터페이스

interface WindowInsetsController insets를 생성하는 Window를 제어하기 위한 인터페이스
public abstract void .hide(types: Int) Insets를 유발하는 Window 집합을 사라지게 한다.
public abstract void .systemBarsBehavior setSystemBarBehavior() 프로퍼티, 시스템바의 행동을 제어한다.
int .BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE @Deprecated
스와이프에 의해 상태바 일시적으로 표시
→ API level 31부터 BEHAVIOR_DEFAULT로 대체됨
int .BEHAVIOR_DEFAULT setSystemBarsBehavior(int)의 기본값 옵션, hide()로 네비게이션바를 숨길 때 Window가 대화형 상태를 유지함.

 

WindowInsets 클래스

final class WindowInsets Window 콘텐츠를 위한 insets 세트 정보
final class .Type Window Insets를 유발하는 여러 소스 유형 정의
static int .Type.statusBars() 상태바
static int .Type.navigationBars() 네비게이션바
static int .Type.captionBar() 캡션바
static int .Type.systemBar() 시스템바

 

WindowManager 인터페이스

interface WindowManager 앱이 Window Manager(창 관리자)와 대화하는 데 사용하는 인터페이스. 각 WindowManager 인스턴스는 특정한 Display에 반인딩된다.
static class .LayoutParams 레이아웃과 관련된 파라미터 상수 모음
static final int .LayoutParams.FLAG_FULLSCREEN @Deprecated
전체화면 설정용 상수.
→ API level 30부터 WindowInsetsController.hide(int) 로 대체

 

Insets

final class Insets 직사각형의 사방면의 여백을 나타내는 offset 정보
public final int .bottom 아래
public final int .left 왼쪽
public final int .right 오른쪽
public final int .top

 


참고자료

  • Android developers reference, https://developer.android.com/reference?hl=en
  • Do it! 깡쌤의 안드로이드 프로그래밍 with Kotlin
Comments