Pasek narzędzi nachodzi na pasek stanu

168

Chcę mieć pasek narzędzi appcompat v21 w mojej aktywności. Ale pasek narzędzi, który implementuję, nakłada się poniżej paska stanu. Jak mogę to naprawić?

nakładający się pasek narzędzi

Oto plik XML układu aktywności:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar" />

    <FrameLayout
        android:id="@+id/container"
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />
</LinearLayout>

Widok paska narzędzi:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?attr/actionBarSize"
    android:background="?attr/colorPrimary" />

Styl motywu:

<style name="AppTheme" parent="MaterialNavigationDrawerTheme.Light.DarkActionBar">
    <item name="colorPrimary">@color/primary</item>
    <item name="colorPrimaryDark">@color/primary_dark</item>
    <item name="colorAccent">@color/accent</item>
</style>
emen
źródło
Jak dostosowałeś swoją aplikację Theme? opublikuj je.
SilentKnight
w CoordinatorLayoutmożesz spróbować: stackoverflow.com/a/47906087/2201814
MHSFisher
dla tych, którzy mają problem z androidx.coordinatorlayout.widget.CoordinatorLayout jako widokiem głównym, powinni ustawić android: fitSystemWindows = "false". to zadziałało dla mnie ... zgodnie z sugestią jednego z użytkowników SO poniżej ..
Muahmmad Tayyib

Odpowiedzi:

273

Użyj android:fitsSystemWindows="true"w widoku głównym układu (w twoim przypadku LinearLayout). I android:fitsSystemWindowsjest

atrybut wewnętrzny, aby dostosować układ widoku w oparciu o okna systemowe, takie jak pasek stanu. Jeśli tak, dostosowuje wypełnienie tego widoku, aby zostawić miejsce na okna systemowe. Będzie obowiązywać tylko wtedy, gdy ten widok jest w działaniu niewymienionym.

Musi być wartością logiczną „prawda” lub „fałsz”.

Może to być również odniesienie do zasobu (w postaci „@ [pakiet:] typ: nazwa”) lub atrybutu motywu (w postaci „? [Pakiet:] [typ:] nazwa”) zawierającego wartość tego typu .

Odpowiada to globalnemu symbolowi zasobu atrybutu fitSystemWindows.

Sohaib
źródło
22
@AimanB możesz ustawić go globalnie, ustawiając w motywie jako <item name="android:fitsSystemWindows">true</item>
Samir
13
@Samir ma to efekt uboczny, jak opisano w tym komentarzu
Sufian
9
Ten problem pojawi się nawet po dodaniu android: fitSystemWindows = "true" do głównego układu, jeśli twój styl zawiera <item name = "android: statusBarColor"> @ android: color / transparent </item> to. Właśnie wspomniane dla tych, którzy czytają to pytanie.
Sakkeer Hussain
3
Mam ten sam problem i android: fitSystemWindows = "true" nie działał dla mnie. Każdy ma rozwiązania, które to proszę opublikować.
Jatin
1
Ta odpowiedź rozwiązała mój problem. Ale teraz znajduję wszystkie tosty dla Androida z dopełnieniem 0!
kds23
18

Po prostu ustaw to na plik v21 / styles.xml

 <item name="android:windowDrawsSystemBarBackgrounds">true</item>
 <item name="android:statusBarColor">@color/colorPrimaryDark</item>

i bądź pewien

 <item name="android:windowTranslucentStatus">false</item>
Zahra.HY
źródło
1
jeśli masz coś takiego jak app: layout_behavior = "@ string / appbar_scrolling_view_behavior", usuń to! @TheHunter
Zahra.HY
ustaw <item name = "android: windowTranslucentStatus"> false </item>
Zahra.HY
10

U mnie problem polegał na tym, że skopiowałem coś z przykładu i użyłem

<item name="android:windowTranslucentStatus">true</item>

samo usunięcie tego rozwiązało mój problem.

Muz
źródło
10

Żadna z odpowiedzi nie zadziałała dla mnie, ale to, co ostatecznie zadziałało po ustawieniu android:fitSystemWindowswidoku głównego (ustawiłem je w stylach v21):

<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:windowTranslucentStatus">false</item>

Upewnij się, że nie masz następującego wiersza, ponieważ AS umieszcza go domyślnie:

<item name="android:statusBarColor">@android:color/transparent</item>
inder_gt
źródło
6

Żadna z odpowiedzi nie działała dla mnie, ale to, co ostatecznie zadziałało po ustawieniu:

android:fitsSystemWindows="false"

W pliku układu aktywności rodzica nie jest to sugerowane w wielu miejscach, ale działa dla mnie i oszczędza mój dzień

anoopbryan2
źródło
Działało to również dla mnie, gdy mój widok główny w układzie był androidx.coordinatorlayout.widget.CoordinatorLayouttypem.
Faheem Ezani
5

Usunąłem wszystkie wymienione poniżej linie z /res/values-v21/styles.xml i teraz działa dobrze.

 <item name="android:windowDrawsSystemBarBackgrounds">true</item>
 <item name="android:statusBarColor">@android:color/transparent</item>


 <item name="windowActionBar">false</item>
 <item name="android:windowDisablePreview">true</item>

 <item name="windowNoTitle">true</item>

 <item name="android:fitsSystemWindows">true</item>
1'hafs
źródło
0

Zgodnie z dokumentacją Google, nie powinniśmy używać atrybutu fitSystemWindows w motywie aplikacji, jest on przeznaczony do użycia w plikach układu. Używanie w motywach może powodować problemy w wyskakujących wiadomościach.

Sprawdź Problem tutaj i przykład problemu, który spowodował tutaj

<item name="android:fitsSystemWindows">true</item>

Przykład użycia prawidłowego sposobu, który działa również dobrze z windowTranslucentStatus .

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout 
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:id="@+id/drawer_layout"

android:fitsSystemWindows="true"

android:layout_width="match_parent"
android:layout_height="match_parent"
> 


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

<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="true"
    android:background="@color/white"
    android:animateLayoutChanges="true"
    app:headerLayout="@layout/navigation_drawer_header"
    app:menu="@menu/navigation_drawer_menu" />

</android.support.v4.widget.DrawerLayout>
Abhishek Garg
źródło
0

Usuń poniższe linie ze stylu lub stylu (21)

<item name="android:windowDrawsSystemBarBackgrounds">true</item>
<item name="android:statusBarColor">@color/colorPrimaryDark</item>
<item name="android:windowTranslucentStatus">false</item>
Lavanya Velusamy
źródło