【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);
}