AppCompat ActionBarActivity를 사용하여 상태 표시 줄 색상 변경


145

내 활동 중 하나에서을 사용하여 툴바 색상을 변경했습니다 Palette. 그러나 5.0을 사용 ActionBarActivity하는 장치 에서 status bar색상을 사용 하는 colorPrimaryDark활동 테마 의 색상은 매우 다르므로 두 가지 매우 다른 색상이 있으며 좋지 않습니다.

5.0 에서는 사용할 수 Window.setStatusBarColor()있지만 ActionBarActivity이것을 가지고 있지 않다는 것을 알고 있습니다 .

그래서 내 질문은 5.0에 있습니다. 상태 표시 줄 색상을 ActionBarActivity어떻게 바꿀 수 있습니까?


SystemBarTint lib를 사용해 보셨습니까? github.com/jgilfelt/SystemBarTint
Nikola Despotoski

답변:


419

문제를 이해하지 못했습니다.

프로그래밍 방식으로 상태 표시 줄 색상을 변경하고 싶습니다 (장치에 Android 5.0이있는 경우)을 사용할 있습니다 Window.setStatusBarColor(). 액티비티가에서 파생되었는지 Activity또는 에서 파생되는지는 차이가 없어야합니다 ActionBarActivity.

그냥 해보십시오.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    Window window = getWindow();
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    window.setStatusBarColor(Color.BLUE);
}

방금 이것을 테스트 ActionBarActivity했으며 정상적으로 작동합니다.


참고 : 스타일 파일에 이미 설정된 FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS플래그는 다음을 통해 프로그래밍 방식으로 values-v21설정할 필요가 없습니다 .

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

1
아 괜찮아getWindow()
tyczj

오래된 안드로이드에서 코드 LOLLIPOP을 찾을 수 없을 때 충돌이 발생합니다. > = 21을 사용하는 것이 가장 좋습니다
code511788465541441

12
@ code578841441 실제로는 그렇지 않습니다. 컴파일 할 때 상수가 인라인됩니다.
matiash

4
@ code578841441 : 이전 SDK로 컴파일하기 때문입니다. 당신은 항상 노력해야 컴파일 나이가 API 버전 제약 (즉,이 경우에도, 최신 안드로이드 SDK와 함께 minSdkVersion및 / 또는 targetSdkVersion온 속성 <uses-sdk ...>요소).
dbm

3
또한 getWindow (). addFlags (WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)를 호출해야했습니다. 작동시키기
Philipp E.

61

상태 표시 줄 색상을 변경하는 방법에는 여러 가지가 있습니다.

1) styles.xml 사용. android : statusBarColor 속성을 사용하여이 작업을 쉽고 정적 방법으로 수행 할 수 있습니다.

참고 :이 속성을 재질 테마와 함께 사용할 수도 있습니다.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="AppTheme.Base">
        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>
</resources>

2) Window 클래스의 setStatusBarColor (int) 메소드를 사용하여 동적으로 수행 할 수 있습니다. 그러나이 방법은 API 21 이상에서만 사용할 수 있습니다. 따라서 확인하십시오. 그렇지 않으면 앱이 더 낮은 기기에서 충돌 할 것입니다.

이 방법의 실제 예는 다음과 같습니다.

if (Build.VERSION.SDK_INT >= 21) {
            Window window = getWindow();
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            window.setStatusBarColor(getResources().getColor(R.color.primaryDark));
}

여기서 primaryDark는 내 앱에서 사용하는 기본 색상의 700 색조입니다. colors.xml 파일에서이 색상을 정의 할 수 있습니다.

시도해보고 궁금한 점이 있으면 알려주세요. 도움이 되길 바랍니다.


window.clearFlags (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)와 같습니다. 필요하지 않습니다 – 그러나 이것은 나를 위해 일했습니다
bkurzius

왜 프로그램 버전은 작동하지만 스타일 버전은 작동하지 않습니까?
앤드류

필자의 경우 활동 스타일에 flah translucent_status가 설정되어 있으므로 window.clearFlags 명령이 없으면 작동하지 않았습니다. 감사합니다!
BMacedo

오 와우! 이것은 받아 들여야합니다, clearFlags내 문제를 수정 추가
fanjavaid

9

상태 표시 줄 색상이 AppCompat에서 아직 구현되지 않았다고 생각합니다. 사용 가능한 속성은 다음과 같습니다.

    <!-- ============= -->
    <!-- Color palette -->
    <!-- ============= -->

    <!-- The primary branding color for the app. By default, this is the color applied to the
         action bar background. -->
    <attr name="colorPrimary" format="color" />

    <!-- Dark variant of the primary branding color. By default, this is the color applied to
         the status bar (via statusBarColor) and navigation bar (via navigationBarColor). -->
    <attr name="colorPrimaryDark" format="color" />

    <!-- Bright complement to the primary branding color. By default, this is the color applied
         to framework controls (via colorControlActivated). -->
    <attr name="colorAccent" format="color" />

    <!-- The color applied to framework controls in their normal state. -->
    <attr name="colorControlNormal" format="color" />

    <!-- The color applied to framework controls in their activated (ex. checked) state. -->
    <attr name="colorControlActivated" format="color" />

    <!-- The color applied to framework control highlights (ex. ripples, list selectors). -->
    <attr name="colorControlHighlight" format="color" />

    <!-- The color applied to framework buttons in their normal state. -->
    <attr name="colorButtonNormal" format="color" />

    <!-- The color applied to framework switch thumbs in their normal state. -->
    <attr name="colorSwitchThumbNormal" format="color" />

( \ sdk \ extras \ android \ support \ v7 \ appcompat \ res \ values ​​\ attrs.xml에서 )


1
이전 OS 버전에서 상태 표시 줄을 수정할 수있는 기능을 제공하지 않으면 AppCompat에서 구현되지 않을 수 있습니다.
TheIT

2
<attr name = "colorPrimaryDark"format = "color"/> <!-기본 브랜딩 색상의 어두운 변형입니다. 기본적으로 이것은 상태 표시 줄 (statusBarColor를 통해) 및 탐색 표시 줄 (navigationBarColor를 통해)에 적용된 색상입니다. ->
Soheil Setayeshi

3

이것을 사용해보십시오, 나는 이것을 사용했으며 v21에서 매우 잘 작동합니다.

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light">
    <item name="colorPrimaryDark">@color/blue</item>
</style>

1

위의 답변에 감사드립니다 .xamarin.android MVVMCross 응용 프로그램에 대한 특정 R & D 후에 그 도움을 받았습니다.

메소드 OnCreate의 활동에 지정된 플래그

protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        this.Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
    }

각 MvxActivity에 대해 테마는 다음과 같습니다.

 [Activity(
    LaunchMode = LaunchMode.SingleTop,
    ScreenOrientation = ScreenOrientation.Portrait,
    Theme = "@style/Theme.Splash",
    Name = "MyView"
    )]

SplashStyle.xml은 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<resources> 
    <style name="Theme.Splash" parent="Theme.AppCompat.Light.NoActionBar">
          <item name="android:statusBarColor">@color/app_red</item>
          <item name="android:colorPrimaryDark">@color/app_red</item>
    </style>
 </resources>

그리고 나는 V7 appcompact를 언급했습니다.


1

[Kotlin 버전] 배터리 상태 아이콘, 시계 등과 같이 원하는 색상이 시스템 UI를 숨길만큼 충분한 대비가 있는지 확인하는이 확장을 만들었으므로 이에 따라 시스템 UI를 흰색 또는 검정색으로 설정합니다.

fun Activity.coloredStatusBarMode(@ColorInt color: Int = Color.WHITE, lightSystemUI: Boolean? = null) {
    var flags: Int = window.decorView.systemUiVisibility // get current flags
    var systemLightUIFlag = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
    var setSystemUILight = lightSystemUI

    if (setSystemUILight == null) {
        // Automatically check if the desired status bar is dark or light
        setSystemUILight = ColorUtils.calculateLuminance(color) < 0.5
    }

    flags = if (setSystemUILight) {
        // Set System UI Light (Battery Status Icon, Clock, etc)
        removeFlag(flags, systemLightUIFlag)
    } else {
        // Set System UI Dark (Battery Status Icon, Clock, etc)
        addFlag(flags, systemLightUIFlag)
    }

    window.decorView.systemUiVisibility = flags
    window.statusBarColor = color
}

private fun containsFlag(flags: Int, flagToCheck: Int) = (flags and flagToCheck) != 0

private fun addFlag(flags: Int, flagToAdd: Int): Int {
    return if (!containsFlag(flags, flagToAdd)) {
        flags or flagToAdd
    } else {
        flags
    }
}

private fun removeFlag(flags: Int, flagToRemove: Int): Int {
    return if (containsFlag(flags, flagToRemove)) {
        flags and flagToRemove.inv()
    } else {
        flags
    }
}

0

지원

    <item name="android:statusBarColor">@color/color_primary_dark</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>

에서 Theme.AppCompat.Light.DarkActionBar나를 위해 일하지 않았다. 트릭은 styles.xml colorPrimaryDark과 함께 평소와 같이 제공합니다.android:colorPrimary

<item name="android:colorAccent">@color/color_primary</item>
<item name="android:colorPrimary">@color/color_primary</item>
<item name="android:colorPrimaryDark">@color/color_primary_dark</item>

그리고 설정에서

if (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
                {
                    Window window = this.Window;
                    Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
                }

code에서 상태 표시 줄 색상을 설정할 필요가 없었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.