2016-04-15 7 views
0

Ich habe eine neue App mit Android Studio 2.0 erstellt und ich möchte meine Navigationsschublade unter der Toolbar haben. Ich weiß, dass die Material Design-Spezifikationen sagen, dass es über der Toolbar sein sollte, aber meine Schublade wird nicht so viele Einträge haben und ich möchte die nette Icon-Animation von Google sehen.NavigationView ohne grauen Rand bei der Verwendung von FitsSystemWindows

Ich habe versucht, zu bekommen, was ich will, indem ich die DrawerLayout innerhalb der obersten Ebene CoordinatorLayout.

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context="com.company.app.MainActivity"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

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

    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.widget.DrawerLayout 
     android:id="@+id/drawer_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" 
     tools:openDrawer="start"> 

     <include layout="@layout/content_main" /> 

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

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

</android.support.design.widget.CoordinatorLayout> 

I android:fitsSystemWindow="true" auf dem obersten Ebene Layout verwenden, so kann ich die Statusleiste tönt. Aber wenn ich das mache, hat die Navigationsschublade einen grauen oberen Rand.

enter image description here

Wenn ich es so, wie Google es (über der Toolbar), dann würde die Grenze in Ordnung sein, aber diese Art und Weise angegeben verwenden würde, es sieht einfach hässlich. Gibt es eine Möglichkeit, dies zu entfernen?

Ich experimentierte mit dem Überschreiben NavigationView.onInsetsChanged(Rect rect) und war in der Lage, die Elemente an der Spitze zu platzieren, aber die graue Grenze blieb.

+0

Was Sie mit "Tönung" in der Statusleiste bedeuten kann ? Diese Farbe kommt von Ihrem 'colorPrimaryDark' – Pztar

+0

Ja, das stimmt. Um aber den Farbtoneffekt von 'colorPrimaryDark' zu erhalten, müssen Sie' android: fitsSystemWindow = "true" 'auf dem Wurzelelement verwenden. Und das verursacht diesen grauen Rand in 'NavigationView' – Saenic

Antwort

8

Ich hatte Kopfschmerzen zu versuchen, dies herauszufinden, und es geschafft, this zu finden, die beschreibt, wie CoordinatorLayoutfitsSystemWindows zu seinem Kind übergibt. Ich denke auf jeden Fall dies ein Fehler ist, da NavigationView schon muss es false gesetzt, aber dann las ich dies:

NavigationView kümmert sich um die Gelege Schutz der Statusleiste für Sie, damit Ihr NavigationView mit dem Status interagiert Bar entsprechend auf API21 + Geräten.

aus der Android Developers Blog. Ich bin mir also nicht sicher, was ich davon halten soll. Ich denke, es könnte daran liegen, dass NavigationView niemals so verwendet werden sollte.

Nichtsdestoweniger, hier ist eine Lösung, die Sie versuchen können, die das graue Balkenproblem behebt, aber ich habe nicht herausgefunden, ob es weitere Probleme verursachen könnte. Wenn ja, bitte zurück posten.

Im activity_main.xml:

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/nav_view" 
     android:layout_width="240dp" 
     android:layout_height="match_parent" 
     android:layout_marginTop="100dp" 
     android:fitsSystemWindows="false"/> 

</android.support.design.widget.CoordinatorLayout> 

In MainActivity Klasse:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); 
     if (navigationView != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT_WATCH) { 
      navigationView.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { 
       @Override 
       public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { 
        return insets; 
       } 
      }); 
     } 
    } 
} 

Sollte erhalten Sie diese:

Screenshot

+0

Wow danke, der' OnApplyWindowInsetsListener' hat wirklich den Trick gemacht. – Saenic

+0

Froh, es hat funktioniert. Ich habe das Gefühl, dass es Probleme geben könnte, wenn die Ansicht später zur Laufzeit aktualisiert wird. Ich denke, das ist der Grund, warum der 'View' Parameter übergeben wird. Wenn das der Fall ist, brauchen Sie nur eine 'if'-Bedingung, dass die Ansicht, die die Einfügungen anwendet, das 'CoordinatorLayout' ist, bevor Sie die Einfügungen zurückgeben. Lass es mich wissen, wenn du darauf kommst, weil ich noch nicht so weit gekommen bin. – Brian