85

Ich habe ein paar Recherchen zu diesem Thema gemacht und ich konnte keine komplette Lösung finden, also Schritt für Schritt und mit ein wenig Versuch und Irrtum, finde ich schließlich heraus, wie wir diese Ergebnisse erreichen können : mit einem transparenten oder farbigen Actionbar und Statusbar. Siehe meine Antwort unten.Android transparente Statusleiste und Actionbar

Antwort

217

Ich entwickle eine App, die in allen Geräten mit> = API14 ähnlich aussehen muss, wenn es um Actionbar und Statusbar-Anpassung geht. Ich habe endlich eine Lösung gefunden und da es ein bisschen Zeit in Anspruch genommen hat, werde ich es teilen, um einige von euch zu retten. Wir beginnen mit der Verwendung einer appcompat-21-Abhängigkeit.

Transparent ActionBar:

Werte/styles.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> 


Werte-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> 

Jetzt können Sie benutze die se Themen in Ihrem AndroidManifest.xml festlegen, welche Aktivitäten einen transparenten oder farbigen ActionBar:

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

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

enter image description hereenter image description here enter image description hereenter image description here enter image description here

Hinweis: in API> = 21 erhalten die Actionbar transparent Sie müssen Holen Sie sich die Statusbar auch transparent, sonst werden Ihre Farbstile nicht respektieren und hellgrau bleiben.



Transparent Statusbar (funktioniert nur mit API> = 19):
Dieses es ziemlich einfach ist einfach den folgenden Code verwenden:

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

Aber Sie werden eine Bekanntmachung funky ergebnis: enter image description here

Dies passiert, weil wenn die Statusbar ist transparent, das Layout verwendet seine Höhe.Um dies zu verhindern, dass wir gerade brauchen:

SOLUTION ONE:
Fügen Sie diese Zeile android:fitsSystemWindows="true" in Ihrem Layout-Ansicht Container von was auch immer Sie brüllen die ActionBar platziert werden soll:

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

SOLUTION TWO:
ein paar Zeilen zu unserer bisherigen Methode hinzufügen:

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

Wo R.id.bellow_actionbar wird das Layout Container Ansicht id werden, was wollen wir unten die Actionbar platziert werden:

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

enter image description here

Das ist es also, denke, es ich etwas nicht zu vergessen. In diesem Beispiel habe ich kein Toolbar verwendet, aber ich denke, es wird das gleiche Ergebnis haben. Dies ist, wie ich meine anpassen 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); 
    } 

Hinweis: dies ein abstract class ist die ActionBarActivity
erweitert Hoffe, es hilft!

+8

Sie sollten wirklich nutzen [android: fitsSystemWindows] (http://developer.android.com/reference/android/view/View.html#attr_android:fitsSystemWindows), wenn Sie Ihre Ansicht, um sicherzustellen, wollen nicht unter die transparente Statusleiste. – ianhanniballake

+1

Das ist völlig richtig, ich habe meinen Code überprüft und ich benutze dies auch. Ich weiß nicht, dass ich es in diesem Beispiel verpasst habe. Ich werde es aktualisieren, danke! – GuilhE

+1

Endlich! Vielen Dank!! Upvoted und Favorit! – DannyThunder

0

Es unterstützt nach KITKAT. Fügen Sie einfach folgenden Code in die OnCreate-Methode Ihrer Aktivität ein. Keine Änderungen an der Manifest-Datei erforderlich.

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

Dies macht die Navigationsleiste auch transparent – NOlivNeto

Verwandte Themen