Problem
I want to show system bars when the user scrolls up the RecyclerView and hides the system bars when the user scrolls down. However, this works with my approach, but the content is weirdly moving and blinking during the show / hide process. U uploaded a video for the behavior here: https://drive.google.com/open?id=0B_b9EpRt-zyHVW54dkQzcXdUTXM
My approach
I mainly have two methods:
private void hideSystemUI() {
getActivity().getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE |
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE);
}
private void showSystemUI() {
getActivity().getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}
And I set this onScrollListener to a RecyclerView to hide and show status bars depending on the scroll:
mFragmentListBinding.fragListRvMovies.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 5) {
hideSystemUI();
} else if (dy < -5) {
showSystemUI();
}
if (pageToDownload < TOTAL_PAGES && layoutManager.findLastVisibleItemPosition() == adapter.movieList.size() - 1 && !isLoadingLocked && !isLoading) {
downloadMoviesList();
}
}
});
And this is the layout:
<?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"
xmlns:tools="http://schemas.android.com/tools">
<android.support.v4.widget.DrawerLayout
android:id="@+id/frag_drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.CoordinatorLayout
android:id="@+id/frag_drawer_coordinator"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="false">
<android.support.design.widget.AppBarLayout
android:id="@+id/frag_drawer_appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay"
android:transitionGroup="false"
tools:targetApi="lollipop">
<android.support.v7.widget.Toolbar
android:id="@+id/frag_drawer_tb"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" />
</android.support.design.widget.AppBarLayout>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/frag_drawer_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="false"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/frag_drawer_fab_add"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="@dimen/material_component_floating_action_button_margin"
android:src="@drawable/ic_add_white_24dp"
android:visibility="gone"
android:fitsSystemWindows="false"
app:backgroundTint="@color/accent"
app:elevation="@dimen/elevation_fab_resting"
app:fabSize="normal" />
<android.support.design.widget.FloatingActionButton
android:id="@+id/frag_drawer_fab_filter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="@dimen/material_component_floating_action_button_margin"
android:fitsSystemWindows="false"
android:src="@drawable/ic_filter"
android:visibility="visible"
app:backgroundTint="@color/accent"
app:elevation="@dimen/elevation_fab_resting"
app:fabSize="normal" />
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView
android:id="@+id/frag_drawer_nav"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:elevation="@dimen/elevation_nav_drawer"
app:headerLayout="@layout/layout_nv_header"
app:itemIconTint="@color/nav_icon_tint"
app:itemTextColor="@color/nav_text"
app:menu="@menu/menu_drawer" />
</android.support.v4.widget.DrawerLayout>
</layout>
My question
How can I better show and hide the status bar and navigation?