【发布时间】:2017-12-07 04:21:28
【问题描述】:
问题
我想在用户向上滚动 RecyclerView 时显示系统栏,并在用户向下滚动时隐藏系统栏。但是,使用我的方法它可以工作,但是在显示/隐藏过程中内容会奇怪地移动和闪烁。你在这里上传了一个视频: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>
我的问题
如何更流畅地显示和隐藏状态栏和导航视图?
【问题讨论】:
-
android 负责管理显示和隐藏状态栏(顶部)和导航栏(底部)的动画。我们无法控制它
-
您是否尝试将 animateLayoutChanges="true" 添加到 RecyclerView 或其父容器?
-
是的,我试过了,但没有任何改变
标签: java android xml android-layout android-recyclerview