नेविगेशन ड्रॉअर अर्ध-पारदर्शी ओवर स्टेटस बार काम नहीं कर रहा है


86

मैं एंड्रॉइड प्रोजेक्ट पर काम कर रहा हूं और मैं नेविगेशन ड्रॉअर को लागू कर रहा हूं। मैं नए मटीरियल डिज़ाइन स्पेस और मटीरियल डिज़ाइन चेकलिस्ट के माध्यम से पढ़ रहा हूं ।
युक्ति कहती है कि स्लाइड आउट फलक को स्टेटस बार सहित बाकी सब से ऊपर तैरना चाहिए और स्टेटस बार के ऊपर अर्ध-पारदर्शी होना चाहिए।

मेरा नेविगेशन पैनल स्टेटस बार खत्म हो गया है लेकिन इसकी कोई पारदर्शिता नहीं है। मैंने इस SO पोस्ट से कोड का अनुसरण किया है जैसा कि Google डेवलपर्स ब्लॉग स्पॉट में सुझाया गया है, ऊपर लिंक मैं एक्शनबार / टूलबार पर और स्टेटस बार के तहत प्रदर्शित करने के लिए DrawerLayout का उपयोग कैसे करूं?

नीचे मेरा XML लेआउट है

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <android.support.v7.widget.Toolbar
            android:id="@+id/my_awesome_toolbar"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:minHeight="?attr/actionBarSize"
            android:background="@color/appPrimaryColour" />
    </LinearLayout>
    <LinearLayout android:id="@+id/linearLayout"
        android:layout_width="304dp"
        android:layout_height="match_parent"
        android:layout_gravity="left|start"
        android:fitsSystemWindows="true"
        android:background="#ffffff">
        <ListView android:id="@+id/left_drawer"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:choiceMode="singleChoice"></ListView>
    </LinearLayout>
</android.support.v4.widget.DrawerLayout>

नीचे मेरी क्षुधा विषय है

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="colorPrimary">@color/appPrimaryColour</item>
        <item name="colorPrimaryDark">@color/appPrimaryColourDark</item>
        <item name="colorAccent">@color/appPrimaryColour</item>
        <item name="windowActionBar">false</item>
        <item name="windowActionModeOverlay">true</item>

    </style>

नीचे मेरे क्षुधा v21 विषय है

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="colorPrimary">@color/appPrimaryColour</item>
    <item name="colorPrimaryDark">@color/appPrimaryColourDark</item>
    <item name="colorAccent">@color/appPrimaryColour</item>
    <item name="windowActionBar">false</item>
    <item name="windowActionModeOverlay">true</item>
    <item name="android:windowDrawsSystemBarBackgrounds">true</item>
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

नीचे मेरी ऑनक्रिट विधि है

protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
    setSupportActionBar(toolbar);

    mDrawerLayout = (DrawerLayout)findViewById(R.id.my_drawer_layout);
    mDrawerList = (ListView)findViewById(R.id.left_drawer);

    mDrawerLayout.setStatusBarBackgroundColor(
        getResources().getColor(R.color.appPrimaryColourDark));

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    {
        LinearLayout linearLayout = 
            (LinearLayout)findViewById(R.id.linearLayout);
        linearLayout.setElevation(30);
    }

नीचे मेरे नेविगेशन ड्रॉअर का एक स्क्रीनशॉट दिखाया गया है जो शीर्ष पर पारदर्शी नहीं है

स्थिति पट्टी पर गैर पारदर्शी दिखाते हुए स्क्रीनशॉट


अपने परिणामों का स्क्रीनशॉट पोस्ट करें।
आलोक नायर

@ क्या आप इसे काम करने में कामयाब रहे हैं?
मिशेल ला फेरला

स्थिति पट्टी में पारदर्शी प्रभाव सेट करने में असमर्थ। कृपया इससे छुटकारा पाएं।
रौनक गढ़िया

जवाबों:


103

आपका स्टेटस बार बैकग्राउंड सफेद है, आपके ड्रॉअर का बैकग्राउंड LinearLayout। क्यों? आप fitsSystemWindows="true"अपने DrawerLayoutऔर इसके LinearLayoutअंदर के लिए सेटिंग्स हैं । यह आपके स्टेटस बार (जो पारदर्शी है) के पीछेLinearLayout विस्तार करता है। इस प्रकार, स्टेटस बार व्हाइट के दराज भाग के लिए पृष्ठभूमि बनाना।

यहाँ छवि विवरण दर्ज करें
यदि आप चाहते हैं कि आपका दराज स्टेटस बार के पीछे न फैले (पूरी स्थिति बार के लिए एक अर्ध-पारदर्शी पृष्ठभूमि रखना चाहते हैं), तो आप दो काम कर सकते हैं:

1) आप बस अपने से किसी भी पृष्ठभूमि मान को हटा सकते हैं LinearLayoutऔर इसके अंदर अपनी सामग्री की पृष्ठभूमि को रंग सकते हैं। या

2) आप fitsSystemWindows="true"अपने से दूर कर सकते हैं LinearLayout। मुझे लगता है कि यह अधिक तार्किक और क्लीनर दृष्टिकोण है। आप स्टेटस बार के तहत एक छाया डाले जाने से भी बचेंगे, जहाँ आपका नेविगेशन ड्रावर विस्तारित नहीं होता है।

यहाँ छवि विवरण दर्ज करें
यदि आप चाहते हैं कि आपका ड्रॉअर स्टेटस बार के पीछे बढ़े और एक अर्ध-पारदर्शी, स्टेटस बार आकार ओवरले हो, तो आप ScrimInsetFrameLayoutअपने ड्रॉअर कंटेंट के लिए एक कंटेनर के रूप में उपयोग कर सकते हैं ( ListViewऔर स्टेटस बार बैकग्राउंड का उपयोग करके सेट कर सकते हैं app:insetForeground="#4000"। बेशक, आप अपनी #4000इच्छानुसार कुछ भी बदल सकते हैं। fitsSystemWindows="true"यहाँ रखना मत भूलना !

या यदि आप अपनी सामग्री को ओवरले नहीं करना चाहते हैं और केवल एक ठोस रंग प्रदर्शित करते हैं, तो आप अपनी पृष्ठभूमि की पृष्ठभूमि को अपनी LinearLayoutइच्छित चीज़ पर सेट कर सकते हैं। हालांकि अपनी सामग्री की पृष्ठभूमि अलग से सेट करना न भूलें!

EDIT: अब आपको इसमें से किसी से भी निपटने की आवश्यकता नहीं है। कृपया एक आसान नेविगेशन ड्रॉअर / व्यू कार्यान्वयन के लिए डिज़ाइन सपोर्ट लाइब्रेरी देखें।


आपकी सहायता के लिए धन्यवाद। वापस आने में देरी के लिए खेद है, व्यस्त व्यस्त था। मैंने आपके उत्तर को पुरस्कृत करने के लिए एक और इनाम दिया है, जैसा कि मैंने मूल रूप से सेट किया था, लेकिन आपके सुझावों को लागू करने के लिए मेरे पास समय से पहले समाप्त हो गया। मुझे दुर्भाग्य से 23 घंटे इंतजार करना पड़ता है इसलिए मैं इसे जल्द से जल्द जोड़
दूंगा

सावधान! विकल्प 1 या 2 के साथ, अपने ओवरड्रॉ को देखना सुनिश्चित करें (आप उन्हें फोन सेटिंग्स में देव विकल्पों में देख सकते हैं)। जब मैंने केवल ड्रॉअर के पीछे की सामग्री के बैकग्राउंड को सब कुछ सेट किया था, तो वह भी ड्रा हो रहा था। अन्यथा महान जवाब, निश्चित रूप से मुझे कुछ समय बचा लिया :)
दैविक दारुन

1
क्या आप कृपया बता सकते हैं कि डिज़ाइन सपोर्ट लाइब्रेरी का उपयोग करने के लिए हमें किस समाधान की आवश्यकता है? मुझे कुछ मुद्दे आ रहे हैं, यहां तक ​​कि जवाब के साथ क्रिस बेंस ने पोस्ट किया।
mDroidd

29

आपको बस स्टेटस बार के लिए कुछ अर्ध-पारदर्शी रंग का उपयोग करना है। अपने v21 थीम में इन पंक्तियों को जोड़ें:

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

यह मत भूलो कि colorसंसाधन (संसाधन) हमेशा प्रारूप में होना चाहिए #AARRGGBB। इसका मतलब है कि रंग में अल्फा मान भी शामिल होगा।


आप आदमी हैं, लेकिन ... क्या आप मुझे बता सकते हैं कि यह केवल उस गतिविधि में क्यों काम करता है जिसमें दराज है? अन्य, जो नहीं हैं, वे स्थिति बार ग्रे दिखाते हैं।
जोकिन इचुक

15

कुछ इसी तरह का उपयोग क्यों नहीं करते?

<android.support.v4.widget.DrawerLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >

    <FrameLayout
            android:id="@+id/content_frame"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>

    <ListView
            android:id="@+id/left_drawer"
            android:layout_width="240dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:choiceMode="singleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp"
            android:background="#80111111"/>
</android.support.v4.widget.DrawerLayout>

उपरोक्त कोड android:backgroundएक्शनबार के भीतर पारदर्शिता दिखाने में सक्षम होने के लिए अल्फा संसाधन का उपयोग करता है ।

कोड के माध्यम से ऐसा करने के अन्य तरीके हैं, जैसा कि अन्य उत्तर दिखाते हैं। ऊपर मेरा जवाब, xml लेआउट फ़ाइल में आवश्यक है, जो कि मेरी राय में आसानी से संपादित किया गया है।


4
क्यों नहीं, लेकिन यह स्पष्ट नहीं है कि आप क्या बदल रहे हैं और यह कैसे सवाल का जवाब दे रहा है।
रात्रि

विभक्त को पृष्ठभूमि रंग में पारदर्शी और उपयोग किए गए अल्फा कोडों के लिए सेट करें
मिशेल ला फेरला

9

यहाँ वर्णित सभी उत्तर बहुत पुराने और लम्बे हैं। नवीनतम नेविगेशन के साथ काम करने वाला सबसे अच्छा और छोटा समाधान है

@Override
public void onDrawerSlide(View drawerView, float slideOffset) {
    super.onDrawerSlide(drawerView, slideOffset);

    try {
        //int currentapiVersion = android.os.Build.VERSION.SDK_INT;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP){
            // Do something for lollipop and above versions

        Window window = 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 to any color with transparency

         window.setStatusBarColor(getResources().getColor(R.color.colorPrimaryDarktrans));}

    } catch (Exception e) {

        Crashlytics.logException(e);

    }
}

जब आप दराज खोलते हैं तो यह आपके स्टेटस बार के रंग को पारदर्शी में बदलने वाला है

अब जब आप ड्रावर को बंद करते हैं तो आपको स्थिति बार के रंग को फिर से अंधेरे में बदलने की आवश्यकता होती है। तो आप इसे इस तरह से कर सकते हैं।

@Override
public void onDrawerClosed(View drawerView) {
   super.onDrawerClosed(drawerView);
    try {
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
            // Do something for lollipop and above versions

            Window window = 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 again to dark
            window.setStatusBarColor(getResources().getColor(R.color.colorPrimaryDark));
        }
    } catch (Exception e) {
        Crashlytics.logException(e);
    }
}

और फिर मुख्य लेआउट में एक ही लाइन जोड़ें

            android:fitsSystemWindows="true"

और आपका ड्रॉअर लेआउट जैसा दिखेगा

            <android.support.v4.widget.DrawerLayout     
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            xmlns:tools="http://schemas.android.com/tools"
            android:id="@+id/drawer_layout"
            android:fitsSystemWindows="true"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

और आपका नेविगेशन दृश्य जैसा दिखेगा

    <android.support.design.widget.NavigationView
        android:id="@+id/navigation_view"
        android:layout_height="match_parent"
        android:layout_width="wrap_content"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/navigation_header"
        app:menu="@menu/drawer"
        />

मैंने इसे और इसके पूरी तरह से काम करने का परीक्षण किया है। यह किसी को मदद करता है। यह सबसे अच्छा तरीका नहीं हो सकता है लेकिन यह आसानी से काम करता है और इसे लागू करने के लिए सरल है। अगर यह मदद करता है तो इसे चिह्नित करें। आसान कोडिंग :)


धन्यवाद! इससे मेरा काफी समय बच गया। यह नवीनतम नेवीगेशन व्यू के साथ पूरी तरह से काम कर रहा है। किसी के लिए भी जो काम नहीं कर सकता, सुनिश्चित करें कि आपने "colorPrimaryDarktrans" के लिए कुछ पारदर्शिता के साथ एक रंग चुना है, अन्यथा आप कोई भी बदलाव नहीं देख सकते।
रुई

पूरी तरह से काम करता है, केवल नुकसान यह है कि स्थिति पट्टी 'ब्लिंक' है जब onDrawerClosed कहा जाता है, लेकिन अगर आप # 05000000 के लिए पारदर्शी रंग colorPrimaryDarktrans सेट यह लगभग unnoticeable है
किरिल Karmazin

8

आपको अपने नेविगेशन ड्रॉअर लेआउट को एक के अंदर लपेटने की आवश्यकता है ScrimLayout

एक ScrimLayoutमूल रूप से अपने नेविगेशन दराज लेआउट पर एक अर्द्ध पारदर्शी आयत खींचता है। इनसेट के आकार को पुनः प्राप्त करने के लिए बस fitSystemWindowsअपने में ओवरराइड करें ScrimLayout

@Override
protected boolean fitSystemWindows(Rect insets) {
    mInsets = new Rect(insets);
    return true;
}

बाद में onDrawएक अर्ध-पारदर्शी आयत बनाने के लिए ओवरराइड ।

एक उदाहरण कार्यान्वयन Google IO ऐप स्रोत में पाया जा सकता है। यहां आप देख सकते हैं कि लेआउट xml में इसका उपयोग कैसे किया जाता है।


5

यदि आप चाहते हैं कि नेविगेशन पैनल स्टेटस बार के ऊपर हो और स्टेटस बार के ऊपर अर्ध-पारदर्शी हो। Google I / O एंड्रॉइड ऐप स्रोत एक अच्छा समाधान प्रदान करता है ( एपीके प्ले स्टोर में पिछले संस्करण में अपडेट नहीं किया गया है)

सबसे पहले आपको एक ScrimInsetFrameLayout चाहिए

/*
* Copyright 2014 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

/**
* A layout that draws something in the insets passed to {@link #fitSystemWindows(Rect)}, i.e. the area above UI chrome
* (status and navigation bars, overlay action bars).
*/
public class ScrimInsetsFrameLayout extends FrameLayout {
    private Drawable mInsetForeground;

    private Rect mInsets;
    private Rect mTempRect = new Rect();
    private OnInsetsCallback mOnInsetsCallback;

    public ScrimInsetsFrameLayout(Context context) {
        super(context);
        init(context, null, 0);
    }

    public ScrimInsetsFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs, 0);
    }

    public ScrimInsetsFrameLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs, defStyle);
    }

    private void init(Context context, AttributeSet attrs, int defStyle) {
        final TypedArray a = context.obtainStyledAttributes(attrs,
                R.styleable.ScrimInsetsView, defStyle, 0);
        if (a == null) {
            return;
        }
        mInsetForeground = a.getDrawable(R.styleable.ScrimInsetsView_insetForeground);
        a.recycle();

        setWillNotDraw(true);
    }

    @Override
    protected boolean fitSystemWindows(Rect insets) {
        mInsets = new Rect(insets);
        setWillNotDraw(mInsetForeground == null);
        ViewCompat.postInvalidateOnAnimation(this);
        if (mOnInsetsCallback != null) {
            mOnInsetsCallback.onInsetsChanged(insets);
        }
        return true; // consume insets
    }

    @Override
    public void draw(Canvas canvas) {
        super.draw(canvas);

        int width = getWidth();
        int height = getHeight();
        if (mInsets != null && mInsetForeground != null) {
            int sc = canvas.save();
            canvas.translate(getScrollX(), getScrollY());

            // Top
            mTempRect.set(0, 0, width, mInsets.top);
            mInsetForeground.setBounds(mTempRect);
            mInsetForeground.draw(canvas);

            // Bottom
            mTempRect.set(0, height - mInsets.bottom, width, height);
            mInsetForeground.setBounds(mTempRect);
            mInsetForeground.draw(canvas);

            // Left
            mTempRect.set(0, mInsets.top, mInsets.left, height - mInsets.bottom);
            mInsetForeground.setBounds(mTempRect);
            mInsetForeground.draw(canvas);

            // Right
            mTempRect.set(width - mInsets.right, mInsets.top, width, height - mInsets.bottom);
            mInsetForeground.setBounds(mTempRect);
            mInsetForeground.draw(canvas);

            canvas.restoreToCount(sc);
        }
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        if (mInsetForeground != null) {
            mInsetForeground.setCallback(this);
        }
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        if (mInsetForeground != null) {
            mInsetForeground.setCallback(null);
        }
    }

    /**
     * Allows the calling container to specify a callback for custom processing when insets change (i.e. when
     * {@link #fitSystemWindows(Rect)} is called. This is useful for setting padding on UI elements based on
     * UI chrome insets (e.g. a Google Map or a ListView). When using with ListView or GridView, remember to set
     * clipToPadding to false.
     */
    public void setOnInsetsCallback(OnInsetsCallback onInsetsCallback) {
        mOnInsetsCallback = onInsetsCallback;
    }

    public static interface OnInsetsCallback {
        public void onInsetsChanged(Rect insets);
    }
}

फिर, अपने XML लेआउट में इस भाग को बदलें

<LinearLayout android:id="@+id/linearLayout"
    android:layout_width="304dp"
    android:layout_height="match_parent"
    android:layout_gravity="left|start"
    android:fitsSystemWindows="true"
    android:background="#ffffff">
    <ListView android:id="@+id/left_drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:choiceMode="singleChoice"></ListView>
</LinearLayout>

LinearLayout को अपने ScrimInsetFrameLayout में इस तरह बदलें

<com.boardy.util.ScrimInsetFrameLayout
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/linearLayout"
    android:layout_width="304dp"
    android:layout_height="match_parent"
    android:layout_gravity="left|start"
    android:fitsSystemWindows="true"
    app:insetForeground="#4000">
    <ListView android:id="@+id/left_drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:choiceMode="singleChoice"></ListView>
</com.boardy.util.ScrimInsetFrameLayout>

HI, उत्तर के लिए धन्यवाद .. मुझे वह नहीं मिल रहा है, जहाँ से हमें OnInsetsCallback मिलता है ... अग्रिम धन्यवाद।
अशोकचक्रवर्ती नागराजन

क्या आप ScrimInsetsView_insetForegroundविशेषता डाल सकते हैं
reegan29

1
android.support.design.internal.ScrimInsetsFrameLayoutसमर्थन पुस्तकालय से उपयोग करें
रोमन

4

मेरे प्रोजेक्ट में लागू करने के लिए मेरे पास एक समान सुविधा थी। और अपने दराज को पारदर्शी बनाने के लिए मैं सिर्फ हेक्स रंगों के लिए पारदर्शिता का उपयोग करता हूं । 6 हेक्स अंकों का उपयोग करते हुए, आपके पास क्रमशः लाल, हरे और नीले रंग के प्रत्येक मूल्य के लिए 2 हेक्स अंक हैं। लेकिन अगर आप दो अतिरिक्त अंक (8 हेक्स अंक) रखते हैं, तो आपके पास ARGB (अल्फा मान के लिए दो अंक) ( लुक ) है।

यहां हेक्स अपारदर्शिता मान हैं: 2 अतिरिक्त अंकों के लिए

100%  FF
95%  F2
90%  E6
85%  D9
80%  CC
75%  BF
70%  B3
65%  A6
60%  99
55%  8C
50%  80
45%  73
40%  66
35%  59
30%  4D
25%  40
20%  33
15%  26
10%  1A
5%  0D
0%  00

छूट के लिए: यदि आपके पास डे हेक्स रंग (# 111111) है तो पारदर्शिता प्राप्त करने के लिए केवल एक अस्पष्टता मान डालें। इस तरह: (# 11111100)

मेरा दराज कार्रवाई पट्टी (आपकी तरह) को कवर नहीं करता है, लेकिन इन मामलों में भी पारदर्शिता लागू की जा सकती है। यहाँ मेरा कोड है:

     <ListView
          android:id="@+id/left_drawer"
          android:layout_width="240dp"
          android:layout_height="match_parent"
          android:layout_gravity="start"
          android:background="#11111100"
          android:choiceMode="singleChoice"
          android:divider="@android:color/transparent"
          android:dividerHeight="0dp" />
</android.support.v4.widget.DrawerLayout>

और यहां एक और लेख है जो आपको हेक्स रंगों में अल्फा कोड को समझने में मदद कर सकता है।


1

मौजूदा समाधान काफी पुराने हैं। यहां नवीनतम समाधान है जो AndroidX या सामग्री पुस्तकालयों पर पूरी तरह से काम करना चाहिए।

  • android:fitsSystemWindows="true"अपने लेआउट के मूल दृश्य में जोड़ें , जो आपके मामले के लिए ड्रालेयआउट के रूप में होता है।

    यह माप पट्टी के लिए संपूर्ण स्क्रीन का उपयोग करने के लिए दृश्य को बताता है, स्थिति बार के साथ अतिव्यापी।

  • अपनी XML शैली में निम्न जोड़ें

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

    windowTranslucentStatusस्टेटस बार को पारदर्शी बना देगा स्टेटस बार
    windowDrawsSystemBarBackgroundsबताता है कि एक ब्लैक शून्य होने के बजाय इसके तहत कुछ भी आकर्षित करें।

  • कॉल DrawerLayout.setStatusBarBackground()या DrawerLayout.setStatusBarBackgroundColor()अपनी मुख्य गतिविधि में

    यह स्थिति पट्टी क्षेत्र को रंगीन करने के लिए ड्रॉयरलैट को बताता है।


0

ऊपर वाले ने अच्छे समाधान दिए, लेकिन उन्होंने मेरे मामले में काम नहीं किया,

मेरा मामला : स्थिति पट्टी में पहले से ही शैलियों का उपयोग करके पीले रंग का सेट है, यह पारभासी नहीं है। और मेरा नेविगेशन दराज का रंग सफेद है, अब जब भी मैं अपना नेविगेशन दराज खींचता हूं तो यह हमेशा स्टेटस बार और नेविगेशन बार के पीछे होता है, क्योंकि नेविगेशन बार का रंग भी सेट होता है।

लक्ष्य: नेविगेशन बार खोलने पर स्थिति बार और नेविगेशन बार का रंग बदल जाता है और इसे बंद होने पर वापस पुनर्स्थापित करना होता है।

समाधान :

        binding.drawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() 
        {
        @Override
        public void onDrawerSlide(@NonNull View drawerView, float slideOffset) {
        }

        @Override
        public void onDrawerOpened(@NonNull View drawerView) {
            getWindow().setStatusBarColor(getResources().getColor(R.color.forground));
            getWindow().setNavigationBarColor(getResources().getColor(R.color.forground));
        }

        @Override
        public void onDrawerClosed(@NonNull View drawerView) {
            getWindow().setStatusBarColor(getResources().getColor(R.color.yellow));
            getWindow().setNavigationBarColor(getResources().getColor(R.color.yellow));
        }

        @Override
        public void onDrawerStateChanged(int newState) {
        }
    });

0

यहां सभी उत्तर बहुत जटिल हैं, मैं आपको सीधे सरल कोड देता हूं। अपनी AppTheme शैली के तहत, कोड की इस पंक्ति को जोड़ें और जब आप दराज खोलेंगे तो आपको एक ग्रे अर्ध पारदर्शी स्थिति पट्टी मिलेगी।

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

यह काम करेगा।

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