8

Ich versuche eine transluzente Statusleiste zu erstellen (so dass meine Navigationsansicht HINTER der Statusleiste ist) aber immer noch die Farbe meiner Aktionsleiste dynamisch ändern möchte. Aus diesem Grund muss die Farbe der Statusleiste zu einer dunkleren Version meiner Aktionsleistenfarbe geändert werden.Transluzente Statusleiste mit dynamischer ActionBar Farbe in Android

Wenn ich meine Statusleiste transparent mache, wie viele Quellen vorschlagen, wird meine primary_dark Farbe als Hintergrund meiner Statusleiste verwendet. Da ich die Aktionsleistenfarbe während der Laufzeit ändern werde, muss primary_dark nicht unbedingt die dunkle Farbe meiner Aktionsleiste sein.

Wenn ich meine Statusleiste auf die Actionbar Farbe gesetzt, ist die Transparenz verschwunden. Wenn ich meine Statusleiste auf die Actionbar-Farbe und Transparenz setze, sieht die Statusleiste weder falsch noch richtig aus und meine überlappende Navigationsansicht ist immer noch nicht sehr "transparent"/"bunt".

Google Inbox hat drei separate Farben: Inbox (blau), Snoozed (gelb) und Done (grün).

Was kann ich tun, um dieses Verhalten zu erreichen?

Antwort

10

Eigentlich ist es ziemlich einfach zu implementieren.

enter image description here

Erster Schritt - ist in der Höhe des Toolbar zu ändern:

  • Änderung height zu wrap_content

so für mich sieht es so aus:

<android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="?attr/colorPrimary" 
     app:popupTheme="@style/AppTheme.PopupOverlay" /> 

Dann außer Kraft setzen Sie Ressourcen für v19:

<?xml version="1.0" encoding="utf-8"?> 
    <resources> 
      <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
        <!-- Style properties --> 
        .... 
        <!-- These properties are important:--> 
        <item name="android:windowTranslucentStatus">true</item> 
        <item name="windowActionBarOverlay">false</item> 
        <item name="android:windowActionBarOverlay">false</item> 
        <item name="android:fitsSystemWindows">false</item> 
      </style> 
    </resources> 

Dann wird in der Activity, Einstellung padding für die Toolbar:

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    toolbar.setPadding(0, getStatusBarHeight(), 0, 0); 
    ...... 
    ...... 
    public int getStatusBarHeight() { 
     int result = 0; 

     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) { 
      int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); 
      if (resourceId > 0) { 
       result = getResources().getDimensionPixelSize(resourceId); 
      } 
     } 
     return result; 
    } 

Und tatsächlich, es ist ziemlich viel es. Nun, wenn ich Farbe der Symbolleiste ändern möchten, ich rufe dies:

if (getSupportActionBar() != null) { 
     getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.GREEN)); 
    } 

Die Tätigkeit des Layout:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawer_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:openDrawer="start"> 

    <include 
     layout="@layout/app_bar_main" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 


    <android.support.design.widget.NavigationView 
     android:id="@+id/nav_view" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:fitsSystemWindows="false" 
     app:headerLayout="@layout/nav_header_main" 
     app:menu="@menu/activity_main_drawer" /> 

</android.support.v4.widget.DrawerLayout> 

NB! Auf Pre-Kitkat OS-Versionen blieb die Statusleiste gleich, nicht durchscheinend.

Ich habe den Quellcode der Testanwendung in meine Dropbox - feel free to check it out - hochgeladen.

Ich hoffe, es hilft

+0

Danke Konstantin, ich werde mich um die Arbeit kümmern! Allerdings: Sie haben keinen NavigationView-bezogenen Code erwähnt. Befindet sich die NavigationView in Ihrem Beispiel hinter der Statusleiste? – Frame91

+0

@ Frame91 Mein Vergnügen! NavigationView in meinem Fall ist unter der Statusleiste: http://i.stack.imgur.com/B3d9G.png Brauchen Sie es so zu sein? –

+0

Aktualisierte die Antwort mit einem Link zur Test-Anwendung (es hat Navigationsschublade und Knöpfe um die Farbe zu wechseln) –