AppCompat ActionBarActivity के साथ स्थिति बार रंग बदलें


145

मेरी गतिविधियों में से एक में, मैंने टूलबार रंग का उपयोग करके बदल दिया Palette। लेकिन रंग का उपयोग ActionBarActivityकरने वाले 5.0 उपकरणों पर मेरे गतिविधि विषय में मेरा status barरंग है colorPrimaryDarkइसलिए मेरे पास 2 बहुत अलग रंग हैं और यह अच्छा नहीं लगता है।

मुझे एहसास है कि 5.0 में आप उपयोग कर सकते हैं Window.setStatusBarColor()लेकिन ActionBarActivityऐसा नहीं है।

इसलिए मेरा सवाल 5.0 में है कि मैं किस तरह से स्टेटस बार का रंग बदल सकता हूं ActionBarActivity?


क्या आपने SystemBarTint का उपयोग करने की कोशिश की है? github.com/jgilfelt/SystemBarTint
निकोला डेस्पोटोस्की

जवाबों:


419

मुझे यकीन नहीं है कि मैं समस्या को समझता हूं।

मुझे लगता है कि आप प्रोग्राम बार का रंग बदलना चाहते हैं (और बशर्ते डिवाइस में एंड्रॉइड 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

पुराने Android में कोड LOLLIPOP नहीं मिलने पर यह क्रैश हो जाएगा। इसका सबसे अच्छा उपयोग करने के लिए> = 21
कोड 511788465541441

12
@ code578841441 दरअसल, ऐसा नहीं होना चाहिए। संकलन करते समय स्थिरांक का झुकाव होता है।
मटियार

4
@ code578841441: ऐसा इसलिए है क्योंकि आप एक पुराने एसडीके का संकलन कर रहे हैं। आपको हमेशा नवीनतम एंड्रॉइड एसडीके के साथ संकलन करने का प्रयास करना चाहिए , भले ही आपके पास पुराने एपीआई संस्करण की कमी हो (यानी तत्व पर minSdkVersion/ और targetSdkVersionविशेषताएँ <uses-sdk ...>)।
dbm

3
मुझे getWindow () भी जोड़ना था। addFlags (WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); इसे बनाने के लिए
फिलिप ई।

61

स्टेटस बार के रंग को बदलने के विभिन्न तरीके हैं।

1) style.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) विधि का उपयोग करके गतिशील रूप से प्राप्त कर सकते हैं। लेकिन याद रखें कि यह विधि केवल एपीआई 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 टिंट है। आप इस रंग को color.xml फ़ाइल में परिभाषित कर सकते हैं।

यह एक कोशिश करो और मुझे बताएं कि क्या आपके कोई प्रश्न हैं। आशा करता हूँ की ये काम करेगा।


यह window.clearFlags (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) जैसा दिखता है; जरूरत नहीं है - लेकिन यह एक मेरे लिए काम करता है
bkurzius

किसी भी विचार क्यों प्रोग्राम संस्करण काम करेगा, लेकिन शैली संस्करण नहीं है?
एंड्रयू

मेरे मामले में गतिविधि की शैली में flah पारभासी_स्टैटस सेट था, इसलिए window.clearFlags कमांड के बिना यह काम नहीं करता था। तो इसके लिए धन्यवाद!
बीएमजेडो

अरे वाह! यह उत्तर स्वीकार किया जाना चाहिए, clearFlagsमेरे मुद्दे को ठीक करें
fanjavaid 10

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 \ मान \ attrs.xml से )


1
यह संभव है कि पुराने ओएस संस्करण स्थिति पट्टी को संशोधित करने की कोई क्षमता प्रदान नहीं करते हैं तो यह एपकॉम में कभी लागू नहीं होगा।
आईआईटी

2
<attr नाम = "colorPrimaryDark" प्रारूप = "रंग" /> <! - प्राथमिक ब्रांडिंग रंग का डार्क संस्करण। डिफ़ॉल्ट रूप से, यह स्टेटस बार (statusBarColor) और नेविगेशन बार (नेविगेशनBarColor के माध्यम से) पर लागू रंग है। ->
सोहिल सेतेशी

3

यह कोशिश करो, मैंने इसे इस्तेमाल किया और यह v21 के साथ बहुत अच्छा काम करता है।

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

1

उपरोक्त जवाब के लिए धन्यवाद, उन की मदद से, कुछ आर एंड डी के बाद xamarin.android MVVMCross आवेदन के लिए, नीचे काम किया

विधि 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

[कोटलिन संस्करण] मैंने यह एक्सटेंशन बनाया है जो यह भी जांचता है कि वांछित रंग में सिस्टम 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मेरे लिए काम किया नहीं था। क्या चाल थी, colorPrimaryDarkजैसा कि हमेशा की तरह android:colorPrimaryस्टाइल में दे रहा है । 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);
                }

कोड में स्टेटबार कलर सेट नहीं करना था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.