จะเปลี่ยนสีแถบสถานะให้ตรงกับแอพใน Lollipop ได้อย่างไร? [Android]


96

ในการอัปเดตอมยิ้มใหม่ฉันสังเกตเห็นว่าเมื่อใช้แอป Google ดั้งเดิมสีของแถบสถานะจะเปลี่ยนไปเพื่อให้ตรงกับแถบการทำงานบนแอปที่คุณกำลังเรียกใช้ ฉันเห็นมันอยู่ในแอพ Twitter ด้วยดังนั้นฉันเดาว่าไม่ใช่เฉพาะ Google ที่ทำได้

ไม่มีใครรู้วิธีทำถ้าเป็นไปได้?

คำตอบ:


221

ในการเปลี่ยนแถบสถานะการใช้สีsetStatusBarColor (สี int) ตาม javadoc เราจำเป็นต้องตั้งค่าสถานะบนหน้าต่างด้วย

ข้อมูลโค้ดที่ใช้งานได้:

Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.setStatusBarColor(ContextCompat.getColor(activity, R.color.example_color));


โปรดทราบว่าสีของแถบสถานะแนวทางการออกแบบวัสดุและสีของแถบการกระทำควรแตกต่างกัน:

  • ActionBarควรใช้สีหลัก 500
  • StatusBarควรใช้สีหลัก 700

ดูภาพหน้าจอด้านล่าง:

ป้อนคำอธิบายภาพที่นี่


4
โปรดทราบว่าเอฟเฟกต์อาจไม่ปรากฏในโปรแกรมจำลอง ตัวอย่างเช่นโครงการตัวอย่างนี้จะแสดงแถบสถานะบน Nexus 9 แต่ไม่ใช่ในโปรแกรมจำลอง Android 5.0
CommonsWare

1
@ เพื่อน: ฉันอ้างถึงโปรแกรมจำลอง Android SDK สิ่งที่ควรทราบว่ากำลังทำงานกับ Genymotion
CommonsWare

3
@Azad ไม่มันไม่ได้ ในการใช้ข้อมูลโค้ดข้างต้นคุณต้องตรวจสอบให้แน่ใจว่าอุปกรณ์ของคุณทำงานบน API 21 ขึ้นไป
klimat

1
ฉันกำลังทำโปรเจ็กต์ที่ค่อนข้างเรียบง่ายและต้องบอกว่าฉันเพิ่งใช้getWindow().setStatusBarColor(activity.getResources().getColor(R.color.example_color));และมันก็ทำงานได้อย่างสมบูรณ์แบบ ไม่แน่ใจเกี่ยวกับบริบทที่แฟล็กจำเป็นอย่างยิ่ง
Joaquin Iurchuk

3
ฉันต้องการแสดงสีในอุปกรณ์ก่อนอมยิ้มด้วย ทำได้ยังไง?
WISHY

48

เพียงเพิ่มสิ่งนี้ในคุณ styles.xml colorPrimary ใช้สำหรับแถบการดำเนินการและ colorPrimaryDark ใช้สำหรับแถบสถานะ

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:colorPrimary">@color/primary</item>
    <item name="android:colorPrimaryDark">@color/primary_dark</item>
</style>

ภาพนี้จากนักพัฒนา android อธิบายเพิ่มเติมเกี่ยวกับพาเลทสี สามารถอ่านเพิ่มเติมได้ที่ลิงค์นี้

ป้อนคำอธิบายภาพที่นี่


Android Studio สร้างรายการต่อไปนี้สำหรับแต่ละโปรเจ็กต์: <color name="colorPrimary">#somecolor</color>และ<color name="colorPrimaryDark">#somecolor</color>. สามารถเปลี่ยนแปลงได้เพื่อให้ได้เอฟเฟกต์ที่ต้องการ
Neurotransmitter

41

วิธีการตั้งค่าสีแถบสถานะหนึ่งคือผ่านstyle.xml

ในการทำเช่นนั้นให้สร้างไฟล์style.xmlภายใต้โฟลเดอร์res / values-v21พร้อมเนื้อหานี้:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="android:Theme.Material">
        <!--   darker variant for the status bar and contextual app bars -->
        <item name="android:colorPrimaryDark">@color/blue_dark</item>
    </style>
</resources>

แก้ไข:ตามที่ระบุไว้ในความคิดเห็นเมื่อใช้ AppCompat รหัสจะแตกต่างกัน ในไฟล์res / values ​​/ style.xmlใช้แทน:

<style name="Theme.MyTheme" parent="Theme.AppCompat.Light">   
    <!-- Set AppCompat’s color theming attrs -->
    <item name="colorPrimary">@color/my_awesome_red</item>
    <item name="colorPrimaryDark">@color/my_awesome_darker_red</item>
    <!-- Other attributes -->
</style>

1
ทำอย่างนั้น แต่ไม่ได้ผล. แต่แล้วฉันก็ใช้ AppCompat แทน Material
Martin

3
@Martin สำหรับ appcompat ใช้ colorPrimaryDark โดยไม่มีคำนำหน้า Android
Michiel

ไม่ทำงานสำหรับ appcompat เช่นกัน (ทดสอบในระดับ 18)
Mohammad Zekrallah

สีของแถบสถานะจะใช้ได้กับอุปกรณ์ที่มี OS API ระดับ 21 ขึ้นไปเท่านั้น นอกจากนี้ในรายการของคุณตรวจสอบให้แน่ใจว่าคุณไม่ได้ลบล้างรูปแบบนี้ในกิจกรรมแต่ละอย่าง
Levon

สำหรับแอปเบราว์เซอร์วิธีเปลี่ยนสีแถบค้นหาเช่นเดียวกับสีของแอป
R.Anandan

23

ในการตั้งค่าสีของแถบสถานะให้สร้างไฟล์ style.xml ภายใต้โฟลเดอร์ res / values-v21 ที่มีเนื้อหานี้:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="AppBaseTheme" parent="AppTheme">
        <item name="android:windowDrawsSystemBarBackgrounds">true</item>
        <item name="android:statusBarColor">@color/blue</item>
    </style>

</resources>

มันบอกว่าไม่สามารถแก้ไขสัญลักษณ์ windowDrawsSystemBarBackgrounds
jmhostalet

4

เพิ่มบรรทัดนี้ในรูปแบบของ v21 หากคุณใช้สองสไตล์

  <item name="android:statusBarColor">#43434f</item>

สิ่งนี้ใช้ไม่ได้หากไม่มีการตั้งค่าสถานะandroid:windowDrawsSystemBarBackgrounds
Slav

4

นอกจากนี้หากคุณต้องการstatus-barสีที่แตกต่างกันสำหรับกิจกรรมที่แตกต่างกัน ( ชิ้นส่วน ) คุณสามารถทำได้โดยทำตามขั้นตอนต่อไปนี้ (ทำงานบน API 21 ขึ้นไป):

ขั้นแรกให้สร้างvalues21/style.xmlและใส่รหัสต่อไปนี้:

 <style name="AIO" parent="AIOBase">
            <item name="android:windowDrawsSystemBarBackgrounds">true</item>
            <item name="android:windowContentTransitions">true</item>
    </style>

จากนั้นกำหนดธีมสีขาว | มืดตามที่คุณvalues/style.xmlต้องการดังต่อไปนี้:

 <style name="AIOBase" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/color_primary</item>
        <item name="colorPrimaryDark">@color/color_primary_dark</item>
        <item name="colorAccent">@color/color_accent</item>
        <item name="android:textColorPrimary">@android:color/black</item>
        <item name="android:statusBarColor" tools:targetApi="lollipop">@color/color_primary_dark
        </item>
        <item name="android:textColor">@color/gray_darkest</item>
        <item name="android:windowBackground">@color/default_bg</item>
        <item name="android:colorBackground">@color/default_bg</item>
    </style>


    <style name="AIO" parent="AIOBase" />

    <style name="AIO.Dark" parent="AIOBase">
        <item name="android:statusBarColor" tools:targetApi="lollipop">#171717
        </item>
    </style>

    <style name="AIO.White" parent="AIOBase">
        <item name="android:statusBarColor" tools:targetApi="lollipop">#bdbdbd
        </item>
    </style>

อย่าลืมใช้ธีมในmanifest.xmlไฟล์.


2

ในอุปกรณ์ Android Pre Lollipop คุณสามารถทำได้จากSystemBarTintManager หากคุณใช้ android studio เพียงแค่เพิ่ม Systembartint lib ในไฟล์ gradle ของคุณ

dependencies {
    compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
    ...
}

จากนั้นในกิจกรรมของคุณ

// create manager instance after the content view is set
SystemBarTintManager mTintManager = new SystemBarTintManager(this);
// enable status bar tint
mTintManager.setStatusBarTintEnabled(true);
mTintManager.setTintColor(getResources().getColor(R.color.blue));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.