Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

fitsSystemWindows not working in Custom Layout within NavigationView

Tags:

android

layout

I have a custom View within the NavigationView. The problem is no matter in what combination, fitsSystemWindows is not working within the NavigationView. and the top item in the drawer always stays behind the transcludent statusbar.

main_layout

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
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:background="@color/colorPrimaryBottomBar"
    android:fitsSystemWindows="true">
        <include layout="@layout/navigation_main_drawer" />
</android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>

navigation_main_drawer

<?xml version="1.0" encoding="utf-8"?>
<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">

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipToPadding="false"
    android:fillViewport="true"
    android:fitsSystemWindows="true"
    android:paddingBottom="@dimen/default_margin">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/default_margin"
        android:fitsSystemWindows="true"
        android:orientation="vertical">

        <LinearLayout
           ...
        </LinearLayout>

        <View
           ... />

        <LinearLayout
           ...
        </LinearLayout>

        <View
           ... />

         <LinearLayout
           ...
        </LinearLayout>

        <View
           ... />

    </LinearLayout>
</ScrollView>
</android.support.design.widget.CoordinatorLayout>
like image 383
Mike Avatar asked Feb 05 '23 23:02

Mike


1 Answers

So, if I've understood correctly, you want your custom view to get the necessary padding so that its contents are not clipped by the status bar right?

If that's the case then you need to set

android:fitsSystemWindows="true"

in your root DrawerLayout, and then set

android:fitsSystemWindows="false"

in your NavigationView component. Note that's false, not true :)

REASONING:

The new NavigationView component designed by Google uses the 'fitsSystemWindows' property to customize how its content relates to the status bar. Note that "customize" here is the key word, because the hardcoded behaviour for this particular component is that its contents should overlap the status bar and reach the top of the screen, while the status bar itself should be transparent to allow the drawer's content to be seen through it. This is specified as part of the new Material Design, as can be seen in https://material.io/guidelines/patterns/navigation-drawer.html.

So, the only way to disable this behaviour is to tell the NavigationView to not signal the fitsSystemWindow property, and only set this in the root DrawerLayout that contains all other views, which will do what you would expect and pad all its children views appropriately.

Note that this reasoning is confirmed also by this comment from Android developer Ian Lake in a blog post talking about this specific property.

P.S.

I would also remove all mentions to the 'fitsSystemWindows' property in all the child elements in your navigation_main_drawer XML, just in case, although it probably does have no effect whatsoever as it is..

like image 93
n00bmind Avatar answered Feb 13 '23 05:02

n00bmind