NavigationView가 전체 화면에 표시되면 status bar와navigation bar를 통해서도 어두운 현상의 해결 방법이 있습니다

android10에 대응하는 일환으로.
https://developer.android.com/guide/navigation/gesturenav#transparent-bars
https://developer.android.com/guide/navigation/gesturenav#vis-flag
항목에서 사용할 수 있는 모든 패밀리를 봅니다.
status bar와navigation bar는 모두 스타일에서 색상을 @android: color/transparent, 자바에서 SystemUiVisibility로 설정합니다.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION、View.SYSTEM_UI_FLAG_LAYOUT_STABLE、View.SYSTEM_UI_FLAG_LAYOUT_전체 화면으로 표시할 수 있도록 FULLSCREEN 플래그를 설정합니다.
하지만 Navigation View만 왠지 위아래 staus bar 부분과navigation bar 부분에 그림자를 남긴다.
 
  • NavigationView(녹색)를 둘러싼 Drawer Layout(파란색)을 열기 전과 후.Drawer Layout만 표시될 때 위아래의 그림자가 사라져 전체 화면으로 표시할 수 있지만 NavigationView 부분에만 그림자가 있습니다.
    ※ 이해하기 쉽도록 Drawer Layout의 하위 View는 Navigation View에만 의존할 수 있으며 펼쳐져도 배경이 어두워지지 않습니다.
    (android10을 지원하지만 렌즈를 뺏는 데 사용되는 단말기는android9의 단말기)
  • 해결 방법


    NavigationView에 app:insetForeground 속성을 추가합니다.
    before
    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    
        <androidx.drawerlayout.widget.DrawerLayout
            android:id="@+id/drawer"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="#afeeee"
            android:fitsSystemWindows="false">
    
            <com.google.android.material.navigation.NavigationView
                android:id="@+id/navigation"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:layout_gravity="left"
                android:background="#00ff00"
                android:fitsSystemWindows="false"/>
    
    
        </androidx.drawerlayout.widget.DrawerLayout>
    
    </layout>
    
    after
    <?xml version="1.0" encoding="utf-8"?>
    <layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    
        <androidx.drawerlayout.widget.DrawerLayout
            android:id="@+id/drawer"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="#afeeee"
            android:fitsSystemWindows="false">
    
            <com.google.android.material.navigation.NavigationView
                android:id="@+id/navigation"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:layout_gravity="left"
                android:background="#00ff00"
                android:fitsSystemWindows="false"
                app:insetForeground="@android:color/transparent" />
    
    
        </androidx.drawerlayout.widget.DrawerLayout>
    
    </layout>
    
  • Drawer Layout을 확대하여 Navigation View를 표시해도 위아래의 그림자가 표시되지 않아 전체 화면에 대응할 수 있습니다!
  • 왜?


    NavigationView는 Scrim Insets FrameLayout의 하위 클래스입니다. 이것은 단말기의 status bar와navigation bar의 높이 부분을 app:inset Foreground에서 지정한 색으로 칠했기 때문입니다.( http://y-anz-m.blogspot.com/2015/06/scriminsetsframelayout-androidbackground.html )

    좋은 웹페이지 즐겨찾기