안드로이드 앱에서 타이틀바 없애기 및 전체화면 만들기

프로그래밍/안드로이드 2021. 8. 6. 22:42
반응형

안드로이드 앱에서 타이틀 바를 없애는 방법입니다. 이 타이틀 바라는 명칭은 타이틀이 나오는 부분이라는 의미로 사용했습니다. 실제로는 안드로이드가 버전업 해오면서 변해 온 앱바(App Bar), 액션바(Action Bar), 툴바(Toolbar) 중의 하나일 것입니다. 이 바(Bar) 들의 기능중에 타이틀을 보여주는 기능이 있는 것입니다.

전체화면 만들기는 앱이 아니라 휴대폰 화면 상단의 통신연결, 배터리 사용량, 시간 등을 보여주는 부분입니다. 이 부분을 보통 상태바라고 부릅니다.

타이틀바와 상태바


1. 타이틀바 없애기

※ styles.xml 파일 또는 themes.xml 파일에서 설정할 수 있습니다.

styles.xml 파일이 있으면 기존의 스타일 아래에 다음 항목을 추가합니다.

<item name="windowNoTitle">true</item>

 

위 코드가 추가된 styles.xml 예시 입니다.

 

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <item name="windowNoTitle">true</item>
    </style>
</resources>


themes.xml 파일에 있을 경우도 동일하게 기존 스타일 항목 아래에 추가하면 됩니다. themes.xml 파일은 아마도 두개 존재할 것입니다. "themes.xml (night)" 로 표시되는 것은 다크모드 테마입니다. 이미 아시겠지만 다크모드는 화면의 배경이 검게 나오는 모드 입니다. 두군데 모두 동일하게 추가하면 되겠습니다.

 

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.HelloKotlin" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/purple_500</item>
        <item name="colorPrimaryVariant">@color/purple_700</item>
        <item name="colorOnPrimary">@color/white</item>
        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/teal_200</item>
        <item name="colorSecondaryVariant">@color/teal_700</item>
        <item name="colorOnSecondary">@color/black</item>
        <!-- Status bar color. -->
        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
        <!-- Customize your theme here. -->
        <item name="windowNoTitle">true</item>
    </style>
</resources>


- 타이틀바를 없애는 방법을 여기저기 찾아 보니까 모두 아래 두 가지 항목을 추가하라고 되어 있었습니다.

<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>


하지만 "windowNoTitle" 항목만 추가해도 문제가 없었습니다. 물론 두 가지를 모두 추가해도 문제가 없었습니다. 반대로 "windowActionBar" 항목 하나만을 추가하면 아래와 같은 내용의 예외가 발생하여 앱이 종료됩니다.

AppCompat does not support the current theme features: {
  windowActionBar: false,
  windowActionBarOverlay: false,
  android:windowIsFloating: false,
  windowActionModeOverlay: false,
  windowNoTitle: false
}

 

※ 프로그램으로 타이틀바를 없애는 방법입니다.

- 아래 코드를 onCreate() 함수내에 setContentView()를 호출하기 전에 호출 하면 됩니다. 레이아웃을 등록한 후에 호출하면 에러가 발생합니다.

requestWindowFeature(Window.FEATURE_NO_TITLE);


다음은 코틀린 코드에서의 예를 든것 입니다.

 

import android.view.Window

...

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

    requestWindowFeature(Window.FEATURE_NO_TITLE);

    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)
}

 

2. 전체화면 만들기(상태바 없애기)

※ styles.xml 또는 themes.xml에 설정하기

- 아래 코드를 타이틀바 없애기에서와 같이 추가합니다. 예시 코드는 생략합니다.

 

<item name="android:windowFullscreen">true</item>


※ 프로그램으로 전체화면 만들기

Android 11 미만이면 아래 코드를 사용합니다.

 

window.setFlags(
    WindowManager.LayoutParams.FLAG_FULLSCREEN ,
    WindowManager.LayoutParams.FLAG_FULLSCREEN
)


Android 11(Api level 30) 코드네임 "Red Velvet Cake" 에서 부터 FLAG_FULLSCREEN이 deprecated 되었으므로 아래 코드를 사용합니다.

 

window.insetsController?.hide(WindowInsets.Type.statusBars())

 


- 다음은 코틀린에서의 예시 입니다.

import android.os.Build
import android.view.WindowInsets
import android.view.WindowManager

...

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

    // 현재 기기의 SDK버전이 안드로이드11 보다 크거나 같다면
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        window.insetsController?.hide(WindowInsets.Type.statusBars())
    } else {
        window.setFlags(
            WindowManager.LayoutParams.FLAG_FULLSCREEN ,
            WindowManager.LayoutParams.FLAG_FULLSCREEN
        )
    }

    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)
}


일단 위의 코드들은 테스트하여 동작하는 것을 확인했지만, 자료를 찾아보면 찾아볼수록 더욱 궁금증만 늘어가고 있습니다. 안드로이드가 계속 버전업 하면서 API가 변경되고, deprecated된 내용도 많아서 인터넷에서 구할 수 있는 자료들이 상당히 오래된 자료가 많은것 같습니다.

특히 원하는 기능을 구현하기 위해 알아낸 코드가 어떤 이유로 그렇게 동작하는지 모르는 상태에서 그냥 사용해야 하는 경우가 종종 있어서 답답하네요. 이유를 찾기 위한 시간이 너무 걸려 포기하는 경우도 있습니다.

반응형

댓글을 달아 주세요