Android 以全屏和列表视图打开应用程序时出现故障

Android glitch opening app with full screen and list views

我已将我的应用程序和 Activity 配置为在全屏模式下工作,但我发现了一个我无法解决的问题。

当我的应用程序启动时,它从加载屏幕转到主屏幕,一切正常,但如果我按下 "home" 按钮并返回到我的应用程序(现在没有加载屏幕,应用程序已启动)然后布局被状态栏取代,我的底部栏被切断。这种效果持续 0.5-1 秒。

出现提醒通知时也会发生这种情况。

我的研究指向列表视图或类似的视图,如 viewpager。 它只是发生在我使用列表视图的活动中,然后我更改了 activity 以管理视图寻呼机上的片段,再次尝试,现在发生在每个片段中,我的意思是我的第 3 页是一个简单的片段,但它没有发生在那个上,但现在有了 view pager 就发生了。

我的清单上有相同主题的所有活动:

<activity
    android:name=".OpenActivity"
    android:screenOrientation="portrait"
    android:theme="@style/AppTheme.FullScreen">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

styles.xml

<style name="AppTheme.FullScreen" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowEnableSplitTouch">false</item>
</style>

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">


<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    android:background="@android:color/transparent">

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/navbar_space" />

    <fragment
        android:id="@+id/nav_bar_fragment"
        android:name="es.udc.psi1516.pickapp.navbar.NavBarFragment"
        android:layout_width="match_parent"
        android:layout_height="@dimen/navbar_height"
        android:orientation="horizontal"
        android:layout_alignParentBottom="true"  />

</RelativeLayout>

我的 MainActivity.java 上有一些代码可以隐藏状态栏:

@Override
protected void onResume() {
    super.onResume();
    hideSystemUI();
}

// This snippet hides the system bars
public void hideSystemUI() {
    int newUiOptions = getWindow().getDecorView().getSystemUiVisibility();
    newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
    newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN;
    newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
    getWindow().getDecorView().setSystemUiVisibility(newUiOptions);
}

只有当您从应用程序图标进入应用程序时才会发生这种情况,如果您从 android 任务视图返回,效果很好。我放弃了,但如果你有任何想法,我会尝试任何事情。

经过大量测试,我找到了解决方案。

我不得不从 xml 样式中删除全屏 属性,它应用了一些破坏我的应用程序屏幕的内部状态。

现在我只能在代码中管理状态。

  1. 删除 android:fitsSystemWindows="true" 这样我的布局就不会为状态栏留下额外的 space。

  2. 从样式中删除 android:windowFullscreen,现在它看起来像这样:

    <style name="AppTheme.FullScreen" parent="Theme.AppCompat.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>
    
  3. 更改标志代码以覆盖 onResume() 上的当前状态,我正在向当前状态添加标志,不要问我为什么,可能某些复制粘贴失败:

    private void hideSystemUI() {
        int newUiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        getWindow().getDecorView().setSystemUiVisibility(newUiOptions);
    }