Android पारदर्शी स्थिति बार और एक्शनबार


97

मैंने इस विषय पर कुछ शोध किए हैं और मैं एक पूर्ण समाधान नहीं खोज सका, इसलिए कदम से कदम और कुछ परीक्षण और त्रुटि के साथ, मैं अंत में पता लगाता हूं कि हम इन परिणामों को कैसे प्राप्त कर सकते हैं: एक पारदर्शी या रंगीन Actionbarऔर Statusbar। देखिये मेरा जवाब बोला।

जवाबों:


238

जब मैं एक्शनबार और स्टेटसबार कस्टमाइजेशन की बात करता हूं तो मैं एक ऐप विकसित कर रहा हूं, जिसमें> = API14 के साथ सभी डिवाइस में समान दिखें। मुझे आखिरकार एक समाधान मिल गया है और चूंकि मुझे अपना थोड़ा सा समय लगा है इसलिए मैं इसे आपके कुछ हिस्से को बचाने के लिए साझा करूंगा। हम एक appcompat-21 निर्भरता का उपयोग करके शुरू करते हैं।

पारदर्शी एक्शनबार :

मान / स्टाइल। xml :

<style name="AppTheme" parent="Theme.AppCompat.Light">
...
</style>

<style name="AppTheme.ActionBar.Transparent" parent="AppTheme">
    <item name="android:windowContentOverlay">@null</item>
    <item name="windowActionBarOverlay">true</item>
    <item name="colorPrimary">@android:color/transparent</item>
</style>

<style name="AppTheme.ActionBar" parent="AppTheme">
    <item name="windowActionBarOverlay">false</item>
    <item name="colorPrimary">@color/default_yellow</item>
</style>


मान- v21 / style.xml :

<style name="AppTheme" parent="Theme.AppCompat.Light">
    ...
</style>

<style name="AppTheme.ActionBar.Transparent" parent="AppTheme">
    <item name="colorPrimary">@android:color/transparent</item>
</style>

<style name="AppTheme.ActionBar" parent="AppTheme">
    <item name="colorPrimaryDark">@color/bg_colorPrimaryDark</item>
    <item name="colorPrimary">@color/default_yellow</item>
</style>

अब आप इन विषयों का उपयोग करके यह बता सकते हैं AndroidManifest.xmlकि कौन सी गतिविधियाँ पारदर्शी या रंगीन होंगी ActionBar:

    <activity
            android:name=".MyTransparentActionbarActivity"
            android:theme="@style/AppTheme.ActionBar.Transparent"/>

    <activity
            android:name=".MyColoredActionbarActivity"
            android:theme="@style/AppTheme.ActionBar"/>

यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें यहां छवि विवरण दर्ज करें

नोट: एपीआई> = 21 में Actionbarपारदर्शी पाने के लिए आपको Statusbarपारदर्शी भी प्राप्त करने की आवश्यकता है, अन्यथा आपके रंग शैलियों का सम्मान नहीं करेंगे और हल्के-भूरे रंग के रहेंगे।



पारदर्शी स्थिति पट्टी (केवल API> = 19 के साथ काम करता है) :
यह बहुत सरल है बस निम्नलिखित कोड का उपयोग करें:

protected void setStatusBarTranslucent(boolean makeTranslucent) {
        if (makeTranslucent) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        } else {
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

लेकिन आपको एक मजेदार परिणाम दिखाई देगा: यहां छवि विवरण दर्ज करें

यह तब होता है क्योंकि जब Statusbarपारदर्शी होता है तो लेआउट इसकी ऊंचाई का उपयोग करेगा। इसे रोकने के लिए हमें बस निम्नलिखित की आवश्यकता है:

समाधान एक: अपने
लाइन android:fitsSystemWindows="true"व्यू कंटेनर में इस लाइन को जोड़ें , जिसे आप एक्शनबार से दूर रखना चाहते हैं:

    ...
        <LinearLayout
                android:fitsSystemWindows="true"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
            ...
        </LinearLayout>
    ...

समाधान दो:
हमारी पिछली पद्धति में कुछ पंक्तियाँ जोड़ें:

protected void setStatusBarTranslucent(boolean makeTranslucent) {
        View v = findViewById(R.id.bellow_actionbar);
        if (v != null) {
            int paddingTop = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ? MyScreenUtils.getStatusBarHeight(this) : 0;
            TypedValue tv = new TypedValue();
            getTheme().resolveAttribute(android.support.v7.appcompat.R.attr.actionBarSize, tv, true);
            paddingTop += TypedValue.complexToDimensionPixelSize(tv.data, getResources().getDisplayMetrics());
            v.setPadding(0, makeTranslucent ? paddingTop : 0, 0, 0);
        }

        if (makeTranslucent) {
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        } else {
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        }
    }

जहां R.id.bellow_actionbarहम चाहते हैं कि लेआउट कंटेनर व्यू आईडी जहां हम चाहते हैं Actionbar:

...
    <LinearLayout
            android:id="@+id/bellow_actionbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        ...
    </LinearLayout>
...

यहां छवि विवरण दर्ज करें

तो यह बात है, ऐसा लगता है कि मैं कुछ नहीं भूल रहा हूं। इस उदाहरण में मैंने उपयोग नहीं किया, Toolbarलेकिन मुझे लगता है कि इसका एक ही परिणाम होगा। इस तरह से मैं अपने को अनुकूलित करता हूं Actionbar:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        View vg = getActionBarView();
        getWindow().requestFeature(vg != null ? Window.FEATURE_ACTION_BAR : Window.FEATURE_NO_TITLE);

        super.onCreate(savedInstanceState);
        setContentView(getContentView());

        if (vg != null) {
            getSupportActionBar().setCustomView(vg, new ActionBar.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
            getSupportActionBar().setDisplayShowCustomEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(false);
            getSupportActionBar().setDisplayShowTitleEnabled(false);
            getSupportActionBar().setDisplayUseLogoEnabled(false);
        }
        setStatusBarTranslucent(true);
    }

नोट: यह एक उम्मीद है कि यह मदद करता abstract classहै बढ़ाता है ActionBarActivity
!


9
यदि आप यह सुनिश्चित करना चाहते हैं कि पारदर्शी स्थिति पट्टी के नीचे नहीं है, तो आपको वास्तव में Android का उपयोग करना चाहिए : fitSystemWindows
atहनुनीबल्लके २

1
यह पूरी तरह सही है, मैं अपने कोड की समीक्षा कर रहा था और मैं इसका भी उपयोग कर रहा हूं। पता नहीं मैं इस उदाहरण में चूक गया। मैं इसे अद्यतन करता हूँ, धन्यवाद!
गुइलह

4
आप MyScreenUtils.getStatusBarHeight(this) यहाँ याद कर रहे हैं जवाब stackoverflow.com/a/3410200/1307690
रोमन Nazarevych

1
वहाँ यह पारदर्शी बनाने के लिए एक रास्ता है और पूरी तरह से पारदर्शी नहीं है? मैं 23
अप्रैल को

6
ट्रांसपेरेंट स्टेटसबार पाने के लिए I वर्क्स को FLAG_LAYOUT_NO_LIMITS ध्वज जोड़ने की आवश्यकता है , getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);उसके बाद कोड डाल देनाgetWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
एडुआर्डो ईआर

3

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

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                Window w = getWindow(); // in Activity's onCreate() for instance
                w.setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS, WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
            }

9
यह नेविगेशन बार को पारदर्शी बनाता है
NOlivNeto

0

कोड की इन पंक्तियों को अपनी गतिविधि / खंडित जावा फ़ाइल में जोड़ें:

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