【Android】【Bug】Activity全屏(保留底部按钮)被打断变成非全屏了

问题

在Activity里面设置全屏显示(保留底部按钮的全屏),刚开始的时候显示的也是全屏,但是在此页面进行一些操作之后,全屏变成非全屏了。

全屏设置方法

在 Activity 中的 onCreate 方法里,添加以下代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 隐藏状态栏(保留底部按钮)
     View decorView = getWindow().getDecorView();
     decorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
     );
}

这样就可以显示全屏了,但是有时候会退出全屏,显示顶部的状态栏,导致页面变化。

问题原因

设置全屏模式可能会受到系统或应用其他元素的影响,导致全屏模式被临时打断。

系统 UI 状态管理

在 Android 中,全屏模式通常通过隐藏状态栏和导航栏来实现。这些 UI 元素的显示与隐藏是由系统控制的。当应用处于全屏模式时,系统会将这些栏隐藏。但是,当应用显示 Toast、对话框或其他系统提示时,这些元素可能会暂时中断全屏状态,以确保用户能够看到这些重要的系统提示信息。

1.Toast 的影响
Toast 是一种短暂的通知,通常显示在屏幕的底部。显示 Toast 时,系统会重新绘制屏幕来保证 Toast 的可见性。这可能导致全屏模式被中断,状态栏和导航栏重新出现。虽然这种情况通常是暂时的,但可能会导致全屏体验的中断。

2.对话框和弹出窗口
对话框、弹出窗口或其他系统级别的提示(如通知、权限请求)通常会覆盖应用的 UI。这些元素通常会强制重新绘制整个屏幕,包括状态栏和导航栏。这是为了确保用户能够清楚地看到这些重要的系统消息和交互元素。

3.全屏模式的持久性
为了确保全屏模式在这些系统元素影响下仍然有效,应用需要在每次返回前台时重新设置全屏状态。全屏模式的设置不是完全持久的,因为系统可能会在需要时恢复默认 UI 元素(如状态栏和导航栏)

如何确保全屏模式

1.在 onResume 中重新设置全屏:
通过在 onResume 中重新设置全屏,可以确保每次应用回到前台时都会重新应用全屏模式。

但是有时候我们会在onResume里面做一些其他操作,代码可能会看起来比较乱。

2.在onWindowFocusChanged里面设置

onWindowFocusChanged 是 Activity 中的一个生命周期方法,它在窗口的焦点状态发生变化时被调用。具体来说,当 Activity 的窗口获得或失去焦点时,这个方法会被触发。它可以用来处理以下情况:

恢复全屏模式:如果应用需要在窗口获得焦点时保持全屏,可以在这个方法中重新设置全屏模式。

更新 UI:可以在这个方法中更新 UI 元素,确保它们在获得焦点时的显示状态是正确的。

管理资源:在窗口失去焦点时,可以暂停动画或释放一些资源,节省系统资源。

所以可以这样设置

    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        View decorView = getWindow().getDecorView();
        decorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
        );
        super.onWindowFocusChanged(hasFocus);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值