2017년 9월 1일 금요일

Android에서 타이틀바(TitleBar) 없애기

 안드로이드 액티비티의 기본 타이틀바가 사실 그대로 사용해도 문제가 없을 만큼 다양한 표현이 가능하거나 미세한 조정이 되지 않기 때문에 대부분 분위기에 맞지 않는 기본 타이틀바를 완전히 없애거나 다른 이미지로 교체하려는 경우가 대부분이다.

 인터넷을 검색해보면 많은 방법을 제시하지만 대부분 안드로이드가 제공하는 테마 기능의 사용을 어렵게 만드는 방법 뿐이다. 즉 AndroidManifest.xml에서 타이틀바가 없는 테마로 기본 테마를 교체하거나 코드에서 테마를 직접 지정하는 것인데 별로 좋은 방법은 아니다.

 그래서 인터넷에 떠도는 몇 가지 방법을 정리해보고 문제점과 최선의 방법을 정리해볼까 한다.  자세히 읽어보고 가장 좋은 방법이 무엇인지 각자 생각해보면 좋겠다. 참고로 나의 경우에는 마지막 방법이 가장 합리적이고 좋은 방법이라고 생각한다.

1. AndroidManifest.xml 파일에서 테마 지정

 안드로이드 프로젝트를 생성하면 기본적으로 AndroidManifest.xml 파일이 생성되고 그 안에는 <application> 태그가 하나 있으며 android:theme 속성이 선언되어있다. 기본적으로 이 속성에는 기본 생성된 style의 AppTheme가 지정되어있지만 기본 테마는 타이틀바가 표시되도록 되어있기 때문에 이 값을 "@android:style/Theme.NoTitleBar"로 바꿔서 타이틀바를 없애는 것이다.


 이 방법은 application의 전체 테마를 완전히 교체하는 것이다. 이미 개발이 어느 정도 진행 중이라면 기존에 지정되어있던 테마의 값을 알게 모르게 사용하고 있을 것이므로 아마도 개발이 어느 정도 진행된 후에 이 값을 바꾸면 앱이 죽거나 글자 색상이나 배경색 등이 완전히 바뀌어 보이는 부작용이 생긴다. 앱이 실행되지 않고 죽는 건 SDK가 버전업되면서 기본적으로 상속받는 Activity 클래스가 다른 파생 클래스로 바뀌면서 이전 버전과 달라졌기 때문이다. 예외를 발생시키는 <activity> 태그의 속성으로 android:theme="@style/Theme.AppCompat"를 지정해주면 해결된다.

 참고로 "@android:style/Theme.NoTitleBar" 테마는 타이틀바를 없애는 속성 말고는 아무것도 선언되지 않은 테마이다. 아마도 전에 있던 색상 값들이 모두 사라지면서 기본 컨트롤들의 색상이 확 바뀌었을 것이다.

  타이틀바도없고 상태바도 없는 Full Screen을 사용하는 테마는 "@android:style/Theme.NoTitleBar.Fullscreen"이므로 기억해두도록 하자.

 <application> 태그 말고 특정 <activity> 태그에 테마를 지정해서 사용할 수도 있다. 같은 속성을 <activity> 태그에 지정하면 된다. 이 경우에는 activity 레벨로 적용된다.

2. requestWindowFeature() 메소드 호출

 Activity의 onCreate() 메소드에서 requestWindowFeature(Window.FEATURE_NO_TITLE)를 호출해주는 방법이다.


 위와 같이 호출해주면 되는데 이 방법은 Activity 클래스를 상속하고 있는 경우에는 동작하지만 AppCompatActivity같은 파생 클래스를 상속하는 경우에는 동작하지 않는다. 예전 SDK의 경우에는 기본 생성되는 프로젝트 템플릿들의 액티비티가 Activity 클래스를 상속했지만 요즘 SDK가 버전업이 되면서 AppCompatActivity등 다른 Activity 파생 클래스를 상속하는 경우가 많으므로 만약 동작하지 않는다면 Activity 클래스로 바꿔서 해보면 동작할 것이다. 하지만 다른 Activity 클래스를 상속하도록 하는데는 다 이유가 있으므로 구버전만 지원할 게 아니라면 이 방법은 추천하지 않는다.

3. setTheme() 메소드 호출

 이 방법도 Activity의 onCreate() 메소드에서 setTheme(android.R.style.Theme_NoTitleBar)를 호출하는 것이다.


 위 그림과 같이 호출해주면 된다. 위의 2번 방법과 다른점은 Activity의 테마를 완전히 교체한다는 것이다. 1번에서 테마를 바꾼 것처럼 완전히 확 바뀐 색상의 Activity의 모습을 보게될 것이다.

 게다가 이 방법은 2번의 문제점도 똑같이 적용된다. Activity를 그대로 상속한 경우에는 잘 동작하는데 AppCompatActivity 등의 다른 파생 클래스를 상속한 경우에는 동작하지 않는 경우가 있다. 마찬가지로 Activity로 바꿔서 해보면 동작은 하겠지만 1번과 2번의 문제점을 동시에 가지고 있는 만큼 이 방법도 사용을 권하지 않는다.

4. 기본 테마에 style 추가 (추천)

 내가 추천하는 가장 안전하고 간단한 방법이다. 아마도 이 방법이 가장 정확한 방법일 것이다. 위의 방법들은 예전에는 먹히는 방법들이었지만 그럼에도 불구하고 사실 편법이었을 뿐이다.

 방법은 간단하다. 프로젝트 생성 시 기본적으로 생성된 style.xml 파일을 열어서 아래 그림과 같이 <item> 하나를 추가하는 것이다.


 사실 이 <item> 태그가 @android:style/Theme.NoTitleBar 테마가 가진 전부이다. 따라서 이 item 태그만 기본 style에 추가해주면 다른 모든 style은 그대로 이고 타이틀바 제거 속성만 enable 시키게 된다. 즉, 이 item을 추가한 후에도 타이틀바 외에 모든 색상, 스타일 등은 그대로 유지된다. 게다가 최신 SDK에서도 전혀 문제가 없다. 인터넷에 떠도는 수많은 정보들은 이 방법을 잘 다루지 않는다. 하지만 가장 제대로 동작하는 방법이다.


댓글 4개:

  1. 감사합니다. 1번 방법을 사용했었는데 스위치 버튼이 안보이는 현상이 발생해서 추천하신 방법으로 바꿔보니 잘 작동되네요. 많은 도움 받아갑니다.

    답글삭제
  2. 크으 사랑함미다 설명 잘하시네

    답글삭제
  3. 앱이 죽거나 글자 색상이나 배경색 등이 완전히 바뀌어 보이는 부작용 -> 이 상황은 어떻게 해결하나요 ㅠㅠ

    답글삭제
  4. 감사합나다!! 도움 받고 갑니다!!

    답글삭제