จะเปลี่ยนสีแถบสถานะใน Android ได้อย่างไร?


427

ก่อนอื่นมันไม่ซ้ำกันในวิธีการเปลี่ยนสีพื้นหลังของแถบสถานะ android

ฉันจะเปลี่ยนสีของแถบสถานะได้อย่างไรซึ่งควรจะเหมือนกับในแถบนำทาง

ฉันต้องการให้สีแถบสถานะเป็นสีเดียวกับแถบนำทาง

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


2
เป็นไปได้เฉพาะหลังจาก kitkat @MarkBuikema
codercat

4
ในฐานะที่เป็นนีลส์แสดงให้เห็นมีแอตทริบิวต์ THEME ตั้งแต่ V21 android:statusBarColorเรียกว่า values-v21/styles.xmlคุณก็สามารถเพิ่มไปยัง
Levite

@ MarkBuikema มันเกี่ยวข้องกับการเข้าถึงรูทอย่างไร!
steve moretz

คำตอบ:


625

Android 5.0 Lollipop เปิดตัวชุดรูปแบบการออกแบบวัสดุซึ่งจะระบายสีแถบสถานะโดยอัตโนมัติตามcolorPrimaryDarkค่าของชุดรูปแบบ

สิ่งนี้ได้รับการสนับสนุนบนอุปกรณ์ pre-lollipop ด้วยการสนับสนุน library-v7-appcompat เริ่มจากรุ่น 21 บล็อกโพสต์เกี่ยวกับการสนับสนุน appcompat v21 จาก Chris Banes

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

อ่านเพิ่มเติมเกี่ยวกับชุดรูปแบบวัสดุบนเว็บไซต์นักพัฒนา Android อย่างเป็นทางการ


29
ด้วยเหตุผลบางประการแอตทริบิวต์ colorPrimaryDark ใช้งานไม่ได้สำหรับฉัน ทดลองใช้โปรแกรมจำลอง v21
deviant

3
มันใช้งานได้คุณต้องเห็นการเปลี่ยนแปลงของตัวจำลองที่ไม่ได้อยู่ในหน้าตัวอย่างของเลย์เอาต์ [มันไม่แสดงที่นั่น]
Mightian

6
colorPrimaryDark ไม่ทำงานสำหรับฉันทั้งบนอีมูเลเตอร์ API 18 จากบทความที่เชื่อมโยงเกี่ยวกับ appcompat: "บนแพลตฟอร์มเก่า AppCompat จะเลียนแบบสีที่เป็นไปได้ในขณะนี้มีข้อ จำกัด ในการระบายสีแถบแอ็คชันและวิดเจ็ตบางส่วน"
Adam Johns

12
สิ่งที่เกี่ยวกับการเปลี่ยนสีตัวอักษรในแถบสถานะ? เอกสารไม่ได้พูดอะไรเกี่ยวกับเรื่องนั้น
Scott Biggs

ฉันพยายามแบบเดียวกัน มันทำงานได้อย่างสมบูรณ์แบบในอุปกรณ์ส่วนใหญ่ทั้งหมด แต่ฉันมี samsung galaxy s4 ที่ใช้ระบบปฏิบัติการ 5.0.1 และในแถบสถานะของโทรศัพท์นี้เป็นสีดำ และเมื่อฉันไปที่กิจกรรมอื่นและกลับมาที่กิจกรรมก่อนหน้าสีแถบสถานะของฉันจะเปลี่ยนเป็นสีธีมของแอพ ด้วยเหตุผลใดเหตุผลนี้เกิดขึ้น
Hitesh Kamani

364

ปรับปรุง:

Lollipop:

public abstract void setStatusBarColor (int color)

เพิ่มในระดับ API 21

Android Lollipop Material Design Guidelinesมาด้วยความสามารถในการเปลี่ยนสีของแถบสถานะในแอปสำหรับประสบการณ์การใช้งานที่สมจริงมากขึ้นและสอดคล้องกับของ Google

นี่คือวิธีที่คุณสามารถเปลี่ยนสีของแถบสถานะโดยใช้ใหม่วิธีนำมาใช้ในwindow.setStatusBarColorAPI level 21

การเปลี่ยนสีของแถบสถานะยังต้องมีการตั้งค่าสถานะเพิ่มเติมสองรายการบนหน้าต่าง คุณต้องเพิ่มการFLAG_DRAWS_SYSTEM_BAR_BACKGROUNDSตั้งค่าสถานะและล้างFLAG_TRANSLUCENT_STATUSค่าสถานะ

รหัสการทำงาน:

import android.view.Window;

...

Window window = activity.getWindow();

// clear FLAG_TRANSLUCENT_STATUS flag:
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

// add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

// finally change the color
window.setStatusBarColor(ContextCompat.getColor(activity,R.color.my_statusbar_color));

การอ้างอิงผู้พัฒนาOffcial : setStatusBarColor (int)

ตัวอย่าง: การออกแบบวัสดุ - ทุกที่

Chris Banes Blog- appcompat v21: การออกแบบวัสดุสำหรับอุปกรณ์ pre-Lollipop!

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

สำหรับพื้นหลังดูจะเป็นtransitionNameandroid:status:background


2
วิธีการแก้ปัญหาสำหรับความเข้ากันได้ย้อนหลังใด ๆ ?
Adam Hurwitz

ดังที่ระบุไว้ในคำตอบโดย Niels: คุณสามารถกำหนดค่าสีแถบสถานะผ่านทางธีม / สไตล์โดยการตั้งค่าandroid:statusBarColorในvalues-v21/styles.xmlไฟล์ของคุณต่อandroiddocs.com/training/material/theme.htmlเช่นนั้น<item name="android:statusBarColor">@color/primary_color</item>
JL West

4
ฉันสามารถเปลี่ยนสีแถบสถานะเป็นสีขาวได้ แต่ฉันไม่เห็นไอคอนการแจ้งเตือนเช่น batery ฉันจะแก้ไขปัญหานี้ได้อย่างไร
MNFS

1
คุณไม่รู้ว่าคุณช่วยฉันได้แค่ไหน ..
Abhishek Dhyani

222

วางนี่คือค่า -v21 / styles.xml ของคุณเพื่อเปิดใช้งานสิ่งนี้บน Lollipop:

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">@color/color_primary</item>
        <item name="colorPrimaryDark">@color/color_secondary</item>
        <item name="colorAccent">@color/color_accent</item>
        <item name="android:statusBarColor">@color/color_primary</item>
    </style>
</resources>

34
สิ่งนี้ต้องใช้ขั้นต่ำ API 21
โรมัน

49
นี่อาจเป็นเหตุผลที่เขาแนะนำให้ใส่ค่า -v21 / styles.xml ;-) น่าจะเป็นคำตอบที่ถูกต้องที่สุดจนถึงตอนนี้ !!
Levite

แต่นี่ยังเตือนสถานะ !!
Nihal Sharma

ฟังก์ชั่นรองรับ compat คืออะไร? แถบสถานะ
blackHawk

คุณสามารถเพิ่มแอtargeApiททริบิวหากคุณต้องการรักษาไฟล์สไตล์เดียว อ่านคำตอบของฉันสำหรับการอ้างอิงstackoverflow.com/a/48565459/4291272
Faisal Shaikh

50

นี่เป็นวิธีที่ง่ายมากในการทำเช่นนี้หากไม่มีไลบรารี่: หากระบบปฏิบัติการไม่รองรับเวอร์ชั่นภายใต้ kitkat - ดังนั้นจึงไม่มีอะไรเกิดขึ้น ฉันทำตามขั้นตอนนี้:

  1. ใน xml ของฉันฉันได้เพิ่มไว้ในมุมมองนี้:
<View
        android:id="@+id/statusBarBackground"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

จากนั้นฉันทำวิธีนี้:

 public void setStatusBarColor(View statusBar,int color){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
           Window w = getWindow();
           w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
           //status bar height
           int actionBarHeight = getActionBarHeight();
           int statusBarHeight = getStatusBarHeight();
           //action bar height
           statusBar.getLayoutParams().height = actionBarHeight + statusBarHeight;
           statusBar.setBackgroundColor(color);
     }
}

คุณต้องใช้ทั้งสองวิธีในการรับแถบแอ็คชันและความสูงของแถบสถานะ:

public int getActionBarHeight() {
    int actionBarHeight = 0;
    TypedValue tv = new TypedValue();
    if (getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
    {
       actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
    }
    return actionBarHeight;
}

public int getStatusBarHeight() {
    int result = 0;
    int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

สิ่งเดียวที่คุณต้องการคือบรรทัดนี้เพื่อตั้งค่าสีแถบสถานะ:

setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));

1
ฉันควรวางองค์ประกอบมุมมองไว้ที่ไหน มันควรจะอยู่ด้านบนของเค้าโครงหลักหรือไม่
Emil Reña Enriquez

ใช่. ใน xml ของคุณ ที่ด้านบนของมัน
itzhar

ข้อควรระวัง: ทำงานเฉพาะกับ Android> = 19 API ในกรณีของฉันฉันต้องการความช่วยเหลือตั้งแต่วันที่ 16
Anton Kizema

setStatusBarColor (findViewById (android.R.id.statusBarBackground) getResources () getColor (android.R.color.white).);
AndroidLad

34

ในฐานะ @Niels กล่าวว่าคุณต้องวางใน values-v21 / styles.xml:

<item name="android:statusBarColor">@color/black</item>

แต่เพิ่มtools:targetApi="lollipop"ถ้าคุณต้องการ styles.xml เดียวเช่น:

<item name="android:statusBarColor" tools:targetApi="lollipop">@color/black</item>

3
ขอบคุณมากสำหรับ "targetApi" ฉันไม่ชอบให้ธีมของฉันกระจายไปทั่วหลายไฟล์ :)
plexus

31

วิธีแก้ปัญหาของ Izhar นั้นใช้ได้ แต่โดยส่วนตัวฉันพยายามหลีกเลี่ยงจากโค้ดที่มีลักษณะดังนี้:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//Do what you need for this SDK
};

เช่นกันฉันไม่ต้องการทำซ้ำรหัสเช่นกัน ในคำตอบของคุณฉันต้องเพิ่มบรรทัดของรหัสดังกล่าวในกิจกรรมทั้งหมด:

setStatusBarColor(findViewById(R.id.statusBarBackground),getResources().getColor(android.R.color.white));

ดังนั้นฉันจึงใช้โซลูชัน Izhar และใช้ XML เพื่อให้ได้ผลลัพธ์เดียวกัน: สร้างเค้าโครงสำหรับ StatusBar status_bar.xml

<View xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="@dimen/statusBarHeight"
     android:background="@color/primaryColorDark"
     android:elevation="@dimen/statusBarElevation">

สังเกตุคุณลักษณะความสูงและระดับความสูงเหล่านี้จะถูกตั้งค่าเป็นค่า values-v19, values-v21 ต่อไป

เพิ่มโครงร่างนี้ในโครงร่างกิจกรรมของคุณโดยใช้ include, main_activity.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/Black" >

<include layout="@layout/status_bar"/>
<include android:id="@+id/app_bar" layout="@layout/app_bar"/>
//The rest of your layout       
</RelativeLayout>

สำหรับ Toolbar ให้เพิ่มแอตทริบิวต์ margin สูงสุด:

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:background="@color/primaryColor"
app:theme="@style/MyCustomToolBarTheme"
app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
android:elevation="@dimen/toolbarElevation"
android:layout_marginTop="@dimen/appBarTopMargin"
android:textDirection="ltr"
android:layoutDirection="ltr">

ใน appTheme style-v19.xml และ styles-v21.xml ของคุณเพิ่ม windowTranslucent attr:

styles-v19.xml, v21:

<resources>
<item name="android:windowTranslucentStatus">true</item>
</resources>

และในที่สุดบน dimens ของคุณ dimens-v19, dimens-v21 ของคุณให้เพิ่มค่าสำหรับ Toolbar topMargin และความสูงของสถานะ BarHeight: dimens.xml น้อยกว่า KitKat:

<resources>
<dimen name="toolbarElevation">4dp</dimen>
<dimen name="appBarTopMargin">0dp</dimen>
<dimen name="statusBarHeight">0dp</dimen>
</resources>

ความสูงของแถบสถานะอยู่ที่ 24dp dimens-v19.xml สำหรับ KitKat ขึ้นไป:

<resources>
<dimen name="statusBarHeight">24dp</dimen>
<dimen name="appBarTopMargin">24dp</dimen>
</resources>

dimens-v21.xml สำหรับ Lolipop เพียงเพิ่มระดับความสูงหากต้องการ:

<resources>
<dimen name="statusBarElevation">4dp</dimen>
</resources>

นี่คือผลลัพธ์สำหรับ Jellybean KitKat และ Lollipop:

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


ดังนั้นแทนที่จะใส่รหัสตรวจสอบคุณได้ใส่ไว้ใน XML วิธีการแก้ปัญหาของคุณจะทำงานกับ Kitkat เช่นเดียวกับสิ่งที่เขาได้รับ
นักพัฒนา android

26

คุณสามารถใช้รหัสง่าย ๆ นี้:

หนึ่งซับใน Kotlin:

window.statusBarColor = ContextCompat.getColor(this, R.color.colorName)

คำตอบเดิมพร้อมการตรวจสอบเวอร์ชั่น Java & คู่มือ:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    getWindow().setStatusBarColor(getResources().getColor(R.color.colorAccentDark_light, this.getTheme()));
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    getWindow().setStatusBarColor(getResources().getColor(R.color.colorAccentDark_light));
}

ContextCompatนอกจากนี้คุณยังสามารถลดความซับซ้อนนี้ได้โดยใช้ ใน Kotlin มันเป็นเพียงแค่นี้:window.statusBarColor = ContextCompat.getColor(this, R.color.colorName)
บัญชี

ตามเวลาที่ฉันเขียนมันผมไม่ได้พยายาม kotlin.Why คุณไม่แก้ไขคำตอบและผมสามารถอนุมัติ :)
สตีฟ Moretz

ความคิดที่ดี. ฉันได้รวมคำแนะนำของฉันไว้ในคำตอบเพื่อเป็นข้อมูลอ้างอิงที่ง่ายสำหรับผู้เข้าชมในอนาคต
ดูแลระบบ

สีแถบสถานะเปลี่ยนไปด้านบน Build.VERSION_CODES.M ไม่ทำงานด้านล่าง Lollipop
Muhammed Haris

@MuhammedHaris เป็น work.did คุณใช้รหัส kotlin หรือ java หรือไม่
สตีฟ moretz

23

เพียงแค่สร้างธีมใหม่ในres / values ​​/ styles.xmlที่คุณเปลี่ยน "colorPrimaryDark" ซึ่งเป็นสีของแถบสถานะ:

<style name="AppTheme.GrayStatusBar" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimaryDark">@color/colorGray</item>
</style>

และปรับเปลี่ยนชุดรูปแบบกิจกรรมในAndroidManifest.xmlเป็นชุดที่คุณต้องการในกิจกรรมถัดไปคุณสามารถเปลี่ยนสีกลับไปเป็นชุดเดิมได้โดยเลือกชุดรูปแบบดั้งเดิม:

<activity
    android:name=".LoginActivity"
    android:theme="@style/AppTheme.GrayStatusBar" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

นี่คือลักษณะที่res / values ​​/ colors.xml ของคุณควรมีลักษณะดังนี้:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#3F51B5</color>
    <color name="colorPrimaryDark">#303F9F</color>
    <color name="colorAccent">#c6d6f0</color>
    <color name="colorGray">#757575</color>
</resources>

1
ฉันคิดว่านี่เป็นทางออกที่ง่ายที่สุด แต่สะอาดที่สุด ไม่จำเป็นต้องมีระดับ API ขั้นต่ำ 21เพียงเอาชนะง่าย สมควรได้รับคะแนนโหวตมากขึ้น
tahsinRupam

สิ่งนี้ไม่ทำงานเมื่อทำงานบน Nougat และ api level ตั้งเป็น 19 มันใช้งานได้ถ้าฉันตั้ง android: ธีมภายใต้โหนดแอปพลิเคชันในไฟล์ Manifest
AndroidDev

18

หากต้องการเปลี่ยนสีสำหรับ lolipop ด้านบนเพียงเพิ่มลงใน styles.xml ของคุณ

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

แต่จำไว้ว่าถ้าคุณต้องการสีอ่อนสำหรับแถบสถานะให้เพิ่มบรรทัดนี้ด้วย

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

1
ขอบคุณมากมันเป็นคำตอบที่เป็นประโยชน์เช่นกัน
Andrew Grow

16

คุณสามารถเปลี่ยนสีของแถบสถานะด้วยฟังก์ชั่นนี้ ทำงานเกี่ยวกับหุ่นยนต์ L หมายถึง API 21 "#ffffff"และสูงกว่าและความต้องการสตริงสีเช่น

private void changeStatusBarColor(String color){
    if (Build.VERSION.SDK_INT >= 21) {
        Window window = getWindow();
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(Color.parseColor(color));
    }
}

15

ฉันมีข้อกำหนดนี้: การเปลี่ยนสีของแถบสถานะโดยทางโปรแกรมทำให้มันโปร่งใสเพื่อให้ Navigation Drawer วาดตัวเองซ้อนทับแถบสถานะ trasparent

ฉันไม่สามารถทำได้โดยใช้ API

getWindow().setStatusBarColor(ContextCompat.getColor(activity ,R.color.my_statusbar_color)

หากคุณตรวจสอบที่นี่ในสแต็กล้นทุกคนก่อนที่บรรทัดของรหัสนั้นจะตั้งค่าความโปร่งใสของแถบสถานะเป็นทึบด้วย

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)

ฉันสามารถจัดการสีและความโปร่งใสของแถบสถานะดังนี้:

  • Android 4: มีอะไรที่คุณทำได้ไม่มากนักเนื่องจากคุณไม่สามารถจัดการสีแถบสถานะจาก API ... สิ่งเดียวที่คุณทำได้คือตั้งแถบสถานะเป็นโปร่งแสงและย้ายองค์ประกอบสีของ UI ของคุณภายใต้สถานะ บาร์. การทำเช่นนี้คุณต้องเล่นกับ

    android:fitsSystemWindows="false"

    ในรูปแบบหลักของคุณ สิ่งนี้ช่วยให้คุณสามารถวาดเค้าโครงคุณภายใต้แถบสถานะ จากนั้นคุณต้องเล่นกับช่องว่างภายในกับด้านบนของเค้าโครงหลักของคุณ

  • Android 5 ขึ้นไป: คุณต้องกำหนดสไตล์ด้วย

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

    สิ่งนี้อนุญาตให้ลิ้นชักการนำทางซ้อนทับแถบสถานะ

    จากนั้นในการเปลี่ยนสีทำให้แถบสถานะโปร่งใสคุณต้องตั้งค่าสีแถบสถานะด้วย

    drawerLayout.setStatusBarBackgroundColor(ContextCompat.getColor(activity, R.color.my_statusbar_color))

    โดย drawerLayout ถูกกำหนดเช่นนี้

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

<item name="android:windowDrawsSystemBarBackgrounds">true</item>จะทำงานให้ฉันโดยไม่ต้อง อย่างไรก็ตามหลังจากผ่านไปหลายวันฉันก็พบบางสิ่งที่ใช้งานได้จริง (ทดสอบเฉพาะใน Lolllipop ในขณะนั้น) ขอบคุณ
DenisGL

ฉันมีปัญหาเดียวกันและคำตอบของคุณช่วยฉันแก้ปัญหานี้
A.Gun

7

แก้ไข colorPrimary ใน colors.xml ใน Values ​​เป็นสีที่คุณต้องการให้ Status Bar เป็น ตัวอย่างเช่น:

   <resources>
<color name="colorPrimary">#800000</color> // changes the status bar color to Burgundy
<color name="colorPrimaryDark">#303F9F</color>
<color name="colorAccent">#FF4081</color>
<color name="red">#FF0000</color>
<color name="white">#FFFFFF</color>
<color name="cream">#fffdd0</color>
<color name="burgundy">#800000</color>


7

หากต้องการเปลี่ยนสีของแถบสถานะให้ไปที่ res/values-v21/styles.xmlและสีของแถบสถานะ

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light">
        <item name="colorPrimary">@color/color_primary</item>
        <item name="colorPrimaryDark">@color/color_secondary</item>
        <item name="colorAccent">@color/color_accent</item>
        <item name="android:statusBarColor">#0000FF</item>
    </style>
</resources>

เฮ้คุณช่วยฉันได้ไหม ฉันไม่รู้เกี่ยวกับ Android และฉันไม่สามารถเริ่มเรียนรู้ได้ตอนนี้ ฉันมีแม่มดแอปเรียบง่ายรันไฟล์ html ฉันกำลังจะเปลี่ยนสีแถบสถานะเนื่องจากด้านบนและล่างของ # 000 น่ากลัวสำหรับเพื่อนของฉัน แต่ฉันทำไม่ได้ฉันไม่สามารถหาไฟล์ styles.xml ได้ ... ถ้าฉันสามารถส่ง apk ให้ฉันและคุณตั้งให้ฉันฉันจะขอบคุณมาก!
Thiago Soubra

6

หากคุณต้องการเปลี่ยนสีแถบสถานะโดยทางโปรแกรม (และให้อุปกรณ์มี Android 5.0) นี่เป็นวิธีง่ายๆในการเปลี่ยนแปลง statusBarColorจากกิจกรรม และวิธีการง่ายมากเมื่อ differents เศษมีสีแถบสถานะที่แตกต่างกัน

 /**
 * @param colorId id of color
 * @param isStatusBarFontDark Light or Dark color
 */
fun updateStatusBarColor(@ColorRes colorId: Int, isStatusBarFontDark: Boolean = true) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        val window = window
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
        window.statusBarColor = ContextCompat.getColor(this, colorId)
        setSystemBarTheme(isStatusBarFontDark)
    }
}

/** Changes the System Bar Theme.  */
@RequiresApi(api = Build.VERSION_CODES.M)
private fun setSystemBarTheme(isStatusBarFontDark: Boolean) {
    // Fetch the current flags.
    val lFlags = window.decorView.systemUiVisibility
    // Update the SystemUiVisibility depending on whether we want a Light or Dark theme.
    window.decorView.systemUiVisibility = if (isStatusBarFontDark) lFlags and View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR.inv() else lFlags or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
}

5

หากคุณต้องการทำงานบน Android 4.4 ขึ้นไปลองสิ่งนี้ ฉันหมายถึงคำตอบของ Harpreet และลิงค์นี้ Android และแถบสถานะโปร่งใส

ก่อนอื่นให้เรียกใช้เมธอด setStatusBarColored ในวิธีการ onCreate ของกิจกรรม (ฉันใส่ไว้ในคลาส util) ฉันใช้รูปภาพที่นี่คุณสามารถเปลี่ยนเป็นสีได้

public static void setStatusBarColored(Activity context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
    {
        Window w = context.getWindow();
        w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        int statusBarHeight = getStatusBarHeight(context);

        View view = new View(context);
        view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
        view.getLayoutParams().height = statusBarHeight;
        ((ViewGroup) w.getDecorView()).addView(view);
        view.setBackground(context.getResources().getDrawable(R.drawable.navibg));
    }
}

public static int getStatusBarHeight(Activity context) {
    int result = 0;
    int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
    if (resourceId > 0) {
        result = context.getResources().getDimensionPixelSize(resourceId);
    }
    return result;
}

ก่อน: ก่อน

หลังจาก: หลังจาก

สีของแถบสถานะมีการเปลี่ยนแปลง แต่แถบ navi ถูกตัดออกดังนั้นเราจำเป็นต้องตั้งค่าระยะขอบหรือออฟเซ็ตของแถบนำทางในวิธี onCreate

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, (int)(this.getResources().getDimension(R.dimen.navibar_height)));
        layoutParams.setMargins(0, Utils.getStatusBarHeight(this), 0, 0);

        this.findViewById(R.id.linear_navi).setLayoutParams(layoutParams);
    }

จากนั้นแถบสถานะจะเป็นดังนี้

แถบสถานะ


4

นี่คือสิ่งที่ทำงานให้ฉันใน KitKat และมีผลลัพธ์ที่ดี

public static void setTaskBarColored(Activity context) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
        {
            Window w = context.getWindow();
            w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            //status bar height
            int statusBarHeight = Utilities.getStatusBarHeight(context);

            View view = new View(context);
            view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
            view.getLayoutParams().height = statusBarHeight;
            ((ViewGroup) w.getDecorView()).addView(view);
            view.setBackgroundColor(context.getResources().getColor(R.color.colorPrimaryTaskBar));
        }
    }

2

ทางออกหนึ่งเพิ่มเติม:

final View decorView = w.getDecorView();
View view = new View(BaseControllerActivity.this);
final int statusBarHeight = UiUtil.getStatusBarHeight(ContextHolder.get());
view.setLayoutParams(new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, statusBarHeight));
view.setBackgroundColor(colorValue);
((ViewGroup)decorView).addView(view);

จะทำงานกับแท็บเล็ตที่แถบสถานะอยู่ที่ด้านล่างของหน้าจอหรือไม่
guy.gc

6
'w' และ 'UiUtil' ที่นี่คืออะไร
Manav Patadia

2

เปลี่ยนcolorPrimaryDarkเป็นสีที่คุณต้องการลงในไฟล์ res / values ​​/ styles.xml

    <resources>
        <color name="colorPrimary">#800000</color>
        <color name="colorPrimaryDark">#303F9F</color> //This Line
        <color name="colorAccent">#FF4081</color>
        <color name="red">#FF0000</color>
        <color name="white">#FFFFFF</color>
       <color name="cream">#fffdd0</color>
       <color name="burgundy">#800000</color>
    </resources>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.