Friday, April 8, 2016

fitsSystemWindows on API16 device doesnt work

Leave a Comment

My activity requests layout as fullscreen:

getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE |View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 

and in the xml layout sets the fitsSystemWindows property to padding the statusbar height:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:id="@+id/drawer_layout"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:fitsSystemWindows="true">  <!-- The main content view -->          <android.support.design.widget.CoordinatorLayout             xmlns:app="http://schemas.android.com/apk/res-auto"             android:id="@+id/main_content"             android:layout_width="match_parent"             android:layout_height="match_parent"             android:fitsSystemWindows="true">              <android.support.design.widget.AppBarLayout                 android:id="@+id/appbar"                 android:layout_width="match_parent"                 android:layout_height="wrap_content"                 android:fitsSystemWindows="true">                  <android.support.design.widget.CollapsingToolbarLayout                     android:id="@+id/collapsing_toolbar"                     android:layout_width="match_parent"                     android:layout_height="wrap_content"                     app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"                     app:contentScrim="@color/actionbar_title_color"                     android:fitsSystemWindows="true"> 

Compiled with appcompat-v7:23.2.1, it works well on API21 device but on API16 device the padding is not applied. Any hints?

UPDATE

Bounty on: why on API16 device the padding is not applied?

1 Answers

Answers 1

From official document Android development pattern

On KitKat and below, your custom View could override fitSystemWindows() and provide any functionality you wanted — just return true if you’ve consumed the insets or false if you’d like to give other Views a chance.

However, on Lollipop and higher devices, we provide some new APIs to make customizing this behavior much easier and consistent with other behaviors for Views. You’ll instead override onApplyWindowInsets(), which allows the View to consume as much or as little of the insets as you need and be able to call dispatchApplyWindowInsets() on child views as needed.

you don’t even need to subclass your Views if you only need custom behavior on Lollipop and higher you can use ViewCompat.setOnApplyWindowInsetsListener(), which will be given preference over the View’s onApplyWindowInsets(). ViewCompat also provides helper methods for calling onApplyWindowInsets() and dispatchApplyWindowInsets() without version checking.

Now, You need to check with condition that which api level is used and according to that apply condition like

if(API < Kitkat){     fitSystemWindows() }else if(API > Lollipop){     onApplyWindowInsets() } 

Please check this answer for more details.

Also read http://developer.android.com/reference/android/view/View.html#fitSystemWindows%28android.graphics.Rect%29

If You Enjoyed This, Take 5 Seconds To Share It

0 comments:

Post a Comment