android एंड्रॉइड पारदर्शी स्टेटस बार और एक्शनबार




android-actionbar android-toolbar (2)

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


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

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

मूल्य / शैलियों.एक्सएमएल :

<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 / styles.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 पारदर्शी प्राप्त करने के लिए आपको Actionbar पारदर्शी भी प्राप्त करने की आवश्यकता है, अन्यथा आपकी रंग शैलियों का सम्मान नहीं करेगा और हल्के भूरे रंग के बने रहेंगे।



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

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" जोड़ें 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 को 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 बढ़ाता है
आशा करता हूँ की ये काम करेगा!


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

 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);
            }




android-statusbar