Мигает монитором Android на экране «Скрыть / Скрыть»

Проблема

Я хочу показать системные бары, когда пользователь прокручивает RecyclerView вверх и скрывает системные бары, когда пользователь прокручивается вниз. Однако с моим подходом это работает, но контент странно движется и мигает во время процесса show / hide. U загрузил видео для поведения здесь: https://drive.google.com/open?id=0B_b9EpRt-zyHVW54dkQzcXdUTXM

Мой подход

В основном у меня есть два метода:

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 // hide nav bar | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar | 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); } 

И я установил этот onScrollListener в RecyclerView, чтобы скрыть и показать строки состояния в зависимости от прокрутки:

  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(); // SystemUIHelper.hide(getActivity()); hideSystemUI(); } else if (dy < -5) { showSystemUI(); // showSystemUI(); // SystemUIHelper.show(getActivity()); } if (pageToDownload < TOTAL_PAGES && layoutManager.findLastVisibleItemPosition() == adapter.movieList.size() - 1 && !isLoadingLocked && !isLoading) { downloadMoviesList(); } } }); 

И это макет:

 <?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> 

Мой вопрос

Как я могу лучше показать и скрыть строку состояния и навигацию?

То, что вы видите, – это изменение размера макета, только так, как вы можете предотвратить наличие макета уже под системным представлением. Проверьте следующие флаги, которые могут помочь вам предотвратить изменение размера: FLAG_LAYOUT_IN_SCREEN FLAG_LAYOUT_INSET_DECOR

Однако имейте в виду, что в исходной позиции часть вашего контента будет за системным интерфейсом, и вам необходимо компенсировать это.

Вы пытались использовать свои методы в потоке пользовательского интерфейса Android? например

 runOnUiThread(new Runnable() { public void run() { // execute your hiding/presenting the bar here } }); 

Существует несколько вариантов использования потока пользовательского интерфейса Android … Взгляните на этот вопрос

// Скрыть строку состояния

. GetWindow () addFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN);

// Показать строку состояния

. GetWindow () clearFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN);