java - Android 屏幕在显示/隐藏系统栏时闪烁

标签 java android xml android-layout android-recyclerview

问题

我想在用户向上滚动 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>

我的问题

如何更流畅地显示和隐藏状态栏和导航 View ?

最佳答案

您看到的是 Layout 调整大小。防止这种情况发生的唯一方法是将 Layout 分层放置在系统 View 下,这样它就不会受到影响。 检查以下标志,这可能会帮助您防止调整大小:

FLAG_LAYOUT_IN_SCREEN
FLAG_LAYOUT_INSET_DECOR

但是请记住,您的内容的顶部将位于系统 UI 的后面,您需要对其进行偏移。

关于java - Android 屏幕在显示/隐藏系统栏时闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44893349/

相关文章:

c# - 使用 XmlWriterSettings 的 XDocument.CreateWriter

java - TextView 在水平布局中不可见

PHP 简单 XML 删除所有子项

java错误:inconvertible types required int

java - 使用mockito在抽象父类(super class)中设置私有(private)字段

java - 不同表单action属性的区别

android - GoogleSignInResult 在生产环境中返回 null GoogleSignInAccount

java - 编译器不识别 Action 监听器类中的参数

android - StreetViewPanorama.getLocation 始终返回 null。

android - 在 mockito 中创建 OkHttpClient 时如何解决 java.lang.AssertionError?