जवाबों:
जब मैं एक्शनबार और स्टेटसबार कस्टमाइजेशन की बात करता हूं तो मैं एक ऐप विकसित कर रहा हूं, जिसमें> = 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
!
MyScreenUtils.getStatusBarHeight(this)
यहाँ याद कर रहे हैं जवाब stackoverflow.com/a/3410200/1307690
FLAG_LAYOUT_NO_LIMITS
ध्वज जोड़ने की आवश्यकता है , getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
उसके बाद कोड डाल देनाgetWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
यह 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);
}