5

Chciałbym usunąć paddingTop/marginTop z widoku nawigacji w trybie wielu okien systemu Android N. Tak jak Gmail już robi. Jeśli widzisz obrazek poniżej, mówię o normalnym wypełnieniu o rozmiarze równym pasku stanu na początku widoku nawigacji.Usuwanie górnej krawędzi widoku nawigacji w trybie Android N Tryb wielu okien

enter image description here

Więc w zasadzie w trybie wielo-okienkowy (patrz zdjęcie poniżej) muszę usunąć tego dopełnienie kiedy moja aplikacja jest w drugiej części ekranu.

enter image description here

Niestety z nowego API 24 masz isInMultiWindowMode() ale to nie jest możliwe, aby wiedzieć, w którym część ekranu jest aplikacja.

Odpowiedz

2

Zamiast próbować dowiedzieć się, czy jesteś w trybie wielu okien i na której części ekranu, musisz zrobić, aby nagłówek widoku nawigacyjnego uwzględniał wstawki w oknach systemu.

Zazwyczaj dotyczy to tylko jednego okienka - do którego jest używana aplikacja. Zwykle nie myślisz nawet, że są jakieś okna. Czy twoja aplikacja nie jest narysowana na pełnym ekranie? Cóż, właściwie nie. Zazwyczaj jest miejsce zarezerwowane dla pasków systemowych, takich jak pasek stanu na górze i pasek nawigacji na dole. Są rysowane w osobnych oknach - oknach systemowych. (Och, a teraz mamy tryb wielu okien w N. Bardziej podobny tryb w wielu aplikacjach, ponieważ jeśli policzysz okna systemu, wiele okien trwa od jakiegoś czasu.)

Możesz zrobić nagłówek widoku nawigacyjnego dostosowuje jego wstawki w zależności od tego, czy znajduje się pod oknem systemu (w tym przypadku: na pasku stanu), czy też nie, za pomocą kilku prostych poprawek.

Przyjmując pogląd nawigacji jest zdefiniowane tak:

<android.support.design.widget.NavigationView 
    ... 
    android:fitsSystemWindows="true" 
    app:headerLayout="@layout/nav_header_main" 
    ... /> 

i jest prosty układ nagłówka w nav_header_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/nav_header_height" 
    android:background="@drawable/nav_header_background" 
    android:orientation="vertical" 
    android:paddingBottom="16dp" 
    android:paddingLeft="16dp" 
    android:paddingRight="16dp" 
    android:paddingTop="32dp"> 

    <ImageView 
     android:id="@+id/imageView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@android:drawable/default_profile_picture" /> 

    ... 

</LinearLayout> 

wystarczy zmienić go tak:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/nav_header_height" 
    android:background="@drawable/nav_header_background" 
    android:fitsSystemWindows="true" 
    android:orientation="vertical"> 

    <ImageView 
     android:id="@+id/imageView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@android:drawable/sym_def_app_icon" 
     android:layout_marginLeft="16dp" 
     android:layout_marginRight="16dp" 
     android:layout_marginTop="8dp"/> 

    ... 

</LinearLayout> 
  1. Najpierw musisz dodaj android:fitsSystemWindows="true" do układu.
  2. Teraz musisz zmniejszyć dopełnienie, ponieważ fitsSystemWindows automatycznie doda dopełnienie rozmiaru paska stanu. Tak więc poprzednio górne dopełnienie znajdowało się u góry nagłówka, teraz jest tylko u dołu paska stanu.
  3. Musisz przenieść wszystkie swoje klocki z układu w innym miejscu (na przykład przesunąłem je do marginesów na widokach podrzędnych), ponieważ fitsSystemWindows nadpisze te klocki.

Po tym, jeśli aplikacja znajduje się w dolnej części podziału na wiele okien, dopełnienie paska stanu nie zostanie dodane. Spowoduje to również, że Twój widok nawigacji będzie wyglądał prawidłowo w innych przypadkach, gdy nie znajduje się on pod paskiem stanu lub pasek stanu zmienia rozmiar w dowolnej przyszłej wersji Androida lub szalonej niestandardowej pamięci ROM.

+0

Myślałem, że android: fitsSystemWindows = "true" w NavigationView było wystarczające. Dodanie Androida: fitsSystemWindows również w układzie nagłówka naprawić problem. Dzięki – br00

+0

Właśnie stwierdziłem, że to rozwiązanie działa tylko dla api 24+ – br00

0

Dla mnie nic nie działa, więc skończyło się na tę drogę i swoją robotę:

<android.support.design.widget.NavigationView 
    ... 
    app:insetForeground="@null"/> 

Technicznie, wypustki są nadal obecne, ale ponieważ zasób insetForeground użyty do rysowania na nich jest zerowa , to logic is skipped in ScrimInsetsFrameLayout's onDraw method (która jest klasą nadrzędną NavigationView).

Kiedy wszystko inne zawiedzie, jest to dość wydajna trasa.