如何用WindowInsetsController替代已废弃的FLAG_FULLSCREEN实现全屏并兼容低版本API?
如何用WindowInsetsController替代已废弃的FLAG_FULLSCREEN实现全屏并兼容低版本API?
刚好之前我也踩过这个坑,官方把FLAG_FULLSCREEN标为废弃后,确实得换用WindowInsetsController来实现全屏,而且还要兼顾旧版本设备,下面给你一套完整的实现方案,直接就能用~
首先,我们需要根据系统版本做分支处理——Android 11(API 30)及以上用新API,以下版本继续用原来的flag,这样就不会有兼容性问题了。
封装一个通用的全屏工具方法
你可以把这个方法放在工具类里,或者直接在Activity里实现,方便全局调用:
public static void setFullScreen(Activity activity) { Window window = activity.getWindow(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // API 30+ 用WindowInsetsController控制状态栏 WindowInsetsController insetsController = window.getInsetsController(); if (insetsController != null) { // 隐藏状态栏(如果需要连导航栏一起隐藏,就改成 Type.statusBars() | Type.navigationBars()) insetsController.hide(WindowInsets.Type.statusBars()); // 可选配置:让状态栏/导航栏在用户滑动时临时显示,松手后自动隐藏 insetsController.setSystemBarsBehavior(WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE); } } else { // 低版本系统继续使用旧的FLAG_FULLSCREEN window.setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN ); // 可选:如果需要让页面内容延伸到状态栏原本的区域,加上这个flag // window.addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); } }
在Activity中调用
比如在MainActivity的onCreate方法里,设置完布局后直接调用:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 触发全屏 setFullScreen(this); }
额外说明
- 如果你的需求是完全沉浸式全屏(隐藏状态栏+导航栏),在API30+的分支里,把
hide的参数改成WindowInsets.Type.statusBars() | WindowInsets.Type.navigationBars()就行,对应旧版本的FLAG_FULLSCREEN | FLAG_HIDE_NAVIGATION。 - 那个
setSystemBarsBehavior是个很实用的配置,用户滑动屏幕边缘时会临时调出状态栏,操作完又自动隐藏,体验和旧的全屏模式一致。
这样写出来的代码,既遵循了官方的新规范,又能完美兼容所有Android版本,不会有废弃方法的警告,也不会在旧设备上出问题~
内容来源于stack exchange
相关产品推荐
相关产品推荐

