android status bar 색상 변경 / 상태바 색상 변경 / 5.0 롤리팝 , 6.0 마시멜로우 까지 적용 / 머티리얼 적용

2016. 6. 13. 11:54mobile/android

 

 

 

test 환경 : win7 / android studio / minSdkVersion 16 / targetSdkVersion 22 / compileSdkVersion 22 / buildToolsVersion 23.0.2 / 5.0 롤리팝 (lollipop) or 6.0 마시멜로우(marshmallow)

 

status bar (상태바)의 색상을 변경해 보자.

 

( 본 내용은 삽질과 삽질 결과 및 해결책이 함께 나와있으니 대충 읽고 따라하면 저와 같이 삽질하게 될것이에요 )

 

기본적으로 머티리얼 테마를 사용하고 action bar 를 없애고 상태바의 색상을 변경했다.

 

res > values > styles.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<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>
    </style>
 
    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>
 
    <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
 
    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
 
</resources>
cs

 

그런데 이상하게 5.0 롤리팝에서만 상태바 색상이 적용이 되지 않는 현상이 있었다.

 

그래서 검색한 결과 5.0 또는 android studio 에서 생성하는 프로젝트는 머티리얼 테마가 적용된다고 하더라...

 

나는 android에 대한 전문적인 지식이 부족하기 때문에 (이게 주 업무가 아니니까 ?) 잘 모른다.

 

그래서 찾아보았다. 머티리얼 테마가 뭔가.....

 

 



 

머티리얼 테마가 무엇이나...

 

구글이 안드로이드 5.0 롤리팝 (lollipop) 을 발표하면서 동시에 디자인 가이드라인을 새로 발표했더라...

 

머티리얼 테마 소개 내용

We challenged ourselves to create a visual language for our users that synthesizes the classic principles of good design with the innovation and possibility of technology and science. This is material design. This spec is a living document that will be updated as we continue to develop the tenets and specifics of material design.

 

이런것이라고 한다.

 

더 자세한 설명은 구글링 해보거나 아래 URL 을 따라가 보길 바란다. 엄청난 녀석인거 같았다.

머티리얼 테마 사이트

 

 

 

어쨋든 나는 status bar (상태바)의 색상을 바꿔야 했다.

 

그래서 다시 구글링해보았다.

 

그랬더니 이런 글이 있었다.

 

롤리팝에서 AppCompatActivity 를 사용하면 머티리얼 테마가 적용되기 때문에 FragmentActivity 에서 status bar 색상을 바꾸려면 window flag의 설정을 바꿔줘야 한다고 한다.

 

뭔소린지는 모르지만 내 activity java 파일을 보니 AppCompatActivity 를 상속받고 있더라.

 

그래서 일단 따라해 보았다.

 

onCreate 함수

1
2
3
4
5
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(getResources().getColor(R.color.colorPrimaryDark));
        }
cs

 

위와 같이 onCreate 함수에 넣어주었더니 status bar 가 내가 정의했던 색상으로 변경되는 것이 아닌가....

 

오...

 

근데 이상한 점이 있다.

 

설명을 다시 잘 읽어보라.

롤리팝에서 AppCompatActivity 를 사용하면 머티리얼 테마가 적용되기 때문에 FragmentActivity 에서 status bar 색상을 바꾸려면 window flag의 설정을 바꿔줘야 한다고 한다.

 

머티리얼 테마가 적용되기 때문에 FragmentActivity 에서 status bar 색상을 바꿀 때 사용하는 소스라고 설명하고 있다.

그 말인 즉슨 머터리얼 테마가 적용되지 않는 예전 FragmentActivity 에서 status bar 색상을 변경할 때 사용해야 한다는 말이다.

 

분명 나는 AppCompatActivity 를 사용중이고 머티리얼 테마를 적용했고 테스트 디바이스는 5.0 롤리팝이였다.

 

위 소스는 수동으로 status bar 색상을 변경하는 방법이였던 것이다.

 

굳이 위의 작업을 하지 않아도 적용이 되어야 한다는 거다...

 

대충읽고 대충적용해서 대충 넘어갈뻔 했다.

 

근데 왜 res > values > styles.xml 에 정의된 머티리얼 테마를 인식하지 못했던 것인가 ?

 



 

고민하고 있는 찰나 의심스러운 폴더를 발견했다.

 

설마했다.

 

기쁨과 짜증이 동시에 밀려온다.

 

android를 모르는 사람은 그럴수 있다고 자기위로가 필요한 시점이다.

 

lollipop 5.0 은 api 21 버전이다.

 

고로 저기 보이는 values-v21 > styles.xml 에 5.0 버전 (롤리팝) 이상에서 사용될 머티리얼 테마가 정의되어 있고 이 파일에 정의되어있는 status bar 색상 설정을 바꿔주어야 적용이 되는 것이다.

 

삽질 끝.

 

values-21 > styles.xml 파일에서 색상을 변경했더니 바로 적용되더라. 아오