เปลี่ยนสีแถบสถานะด้วย AppCompat ActionBarActivity


145

Paletteหนึ่งในกิจกรรมของฉันฉันเปลี่ยนสีโดยใช้แถบเครื่องมือ แต่ใน 5.0 อุปกรณ์ที่ใช้สีเป็นสีของฉันในชุดรูปแบบกิจกรรมของฉันเพื่อให้ฉันมี 2 สีที่แตกต่างกันมากและมันก็ไม่ได้ดูดีActionBarActivitystatus barcolorPrimaryDark

ฉันรู้ว่าใน 5.0 คุณสามารถใช้Window.setStatusBarColor()แต่ActionBarActivityไม่มีสิ่งนี้

ดังนั้นคำถามของฉันคือ 5.0 ฉันจะเปลี่ยนสีของแถบสถานะได้ActionBarActivityอย่างไร


คุณได้ลองใช้ SystemBarTint lib แล้วหรือยัง? github.com/jgilfelt/SystemBarTint
Nikola Despotoski

คำตอบ:


419

ฉันไม่แน่ใจว่าฉันเข้าใจปัญหา

ฉันคุณต้องการที่จะเปลี่ยนสีแถบสถานะโปรแกรม (และจัดให้มีอุปกรณ์ที่มี Android 5.0) แล้วคุณสามารถWindow.setStatusBarColor()ใช้ มันไม่ควรสร้างความแตกต่างไม่ว่าจะเป็นกิจกรรมที่ได้มาจากหรือActivityActionBarActivity

แค่ลองทำ:

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 ใน androids รุ่นเก่า มันใช้งานได้ดีที่สุด> = 21
code511788465541441

12
@ code578841441 ที่จริงแล้วไม่น่าจะเกิดขึ้น ค่าคงที่จะอินไลน์เมื่อรวบรวม
matiash

4
@ code578841441: นั่นเป็นเพราะคุณกำลังคอมไพล์ด้วย SDK ที่เก่ากว่า คุณควรพยายามรวบรวม Android SDK ล่าสุดเสมอแม้ว่าคุณจะมีข้อ จำกัด เวอร์ชัน API เก่ากว่า (เช่น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) คุณสามารถทำได้โดยใช้วิธี setStatusBarColor (int) ในคลาส Window แต่โปรดจำไว้ว่าวิธีนี้ใช้ได้เฉพาะกับ 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
อาจเป็นไปได้ว่าจะไม่มีการนำไปใช้ใน 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 MVVMC ข้ามด้านล่าง

ตั้งค่าสถานะที่ระบุสำหรับกิจกรรมในเมธอด 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"
    )]

My 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>

และฉันมีแอป Vactcompat ที่อ้างถึง


1

[เวอร์ชั่น Kotlin] ฉันสร้างส่วนขยายนี้ที่ตรวจสอบว่าสีที่ต้องการมีความคมชัดเพียงพอที่จะซ่อน System UI เช่นไอคอนสถานะแบตเตอรี่, นาฬิกา ฯลฯ ดังนั้นเราจึงตั้งค่า System 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ไม่ทำงานสำหรับฉัน สิ่งที่หลอกลวงคือให้colorPrimaryDarkตามปกติพร้อมกับ android:colorPrimaryใน styles.xml

<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);
                }

ไม่ต้องตั้งค่าสีแถบสถานะในรหัส

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.