具有全屏和列表视图的 Android 故障打开应用程序

Posted

技术标签:

【中文标题】具有全屏和列表视图的 Android 故障打开应用程序【英文标题】:Android glitch opening app with full screen and list views 【发布时间】:2020-07-27 22:00:03 【问题描述】:

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

当我的应用程序启动时,它会从加载屏幕转到主屏幕,一切正常,但如果我按下“主页”按钮并返回到我的应用程序(现在没有加载屏幕,应用程序已启动),那么布局会被状态栏,我的底栏被剪掉了。此效果持续 0.5-1 秒。

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

我的研究指向列表视图或类似视图,例如 viewpager。 它只是发生在我的带有列表视图的活动中,然后我更改了我的活动以管理视图寻呼机上的片段,再次尝试,现在发生在每个片段中,我的意思是我的第三页是一个简单的片段,它没有发生在那一个,但现在有了 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_
    android:layout_
    android:fitsSystemWindows="true">


<RelativeLayout
    android:layout_
    android:layout_
    android:orientation="horizontal"
    android:background="@android:color/transparent">

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

    <fragment
        android:id="@+id/nav_bar_fragment"
        android:name="es.udc.psi1516.pickapp.navbar.NavBarFragment"
        android:layout_
        android:layout_
        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);

只有当您从 App Icon 进入 App 时才会发生这种情况,如果您从 android 任务视图返回,它会运行良好。我放弃了,但如果你有任何想法,我会尝试任何东西。

【问题讨论】:

【参考方案1】:

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

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

现在我必须在代码中管理状态。

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

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

    <style name="AppTheme.FullScreen" parent="Theme.AppCompat.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>
    

    更改标志代码以覆盖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);
    
    

【讨论】:

以上是关于具有全屏和列表视图的 Android 故障打开应用程序的主要内容,如果未能解决你的问题,请参考以下文章

UICollectionViewController Thumbnail 图像视图全屏和滚动手势

非全屏和全屏 UIViewController 之间的漂亮幻灯片过渡

单击列表视图项目时,Android youtube api可全屏加载视频

MVVM + WPF - 为具有多个视图的 ViewModel 设计

Android 实现从网络获取视频URL显示在视频播放器(IjkVideoView)能全屏和保存视频到手机的功能

使用旋转和按钮处理 VideoView 全屏和纵向