Android 15强制全屏模式下Google AdMob插页广告Insets适配问题求助
解决AdMob插页广告不适配系统栏Insets(刘海/状态栏遮挡)的问题
AdMob插页广告是作为独立Window加载的,不会自动继承宿主Activity的Insets配置,所以需要针对广告Window单独处理Insets适配,以下是可行的解决方案:
方案1:通过FullScreenContentCallback监听广告展示,手动设置Insets
利用AdMob的FullScreenContentCallback捕获广告展示的时机,此时广告Window已创建,直接对其DecorView设置Insets监听:
// 假设你已经初始化了interstitialAd interstitialAd.setFullScreenContentCallback(new FullScreenContentCallback() { @Override public void onAdShowedFullScreenContent() { Window adWindow = getWindow(); if (adWindow != null) { View decorView = adWindow.getDecorView(); // 给广告的根视图设置Insets监听 ViewCompat.setOnApplyWindowInsetsListener(decorView, (view, insets) -> { // 获取状态栏和导航栏的Insets值 WindowInsetsCompat.Type systemBars = WindowInsetsCompat.Type.systemBars(); int statusBarInset = insets.getInsets(systemBars).top; int navBarInset = insets.getInsets(systemBars).bottom; // 给广告视图设置padding,避开系统栏区域 view.setPadding( view.getPaddingLeft(), statusBarInset, view.getPaddingRight(), navBarInset ); // 返回Insets,允许其他视图继续处理(如果需要) return insets; }); // 手动触发Insets重新计算,确保设置生效 ViewCompat.requestApplyInsets(decorView); } } @Override public void onAdDismissedFullScreenContent() { // 广告关闭后,恢复宿主Activity原有的Insets监听(如果之前保存了的话) // ViewCompat.setOnApplyWindowInsetsListener(root, yourOriginalInsetsListener); } });
方案2:配置广告Window的系统栏适配行为
在广告展示时,修改其Window的默认适配规则,确保它能正确获取并应用Insets:
interstitialAd.setFullScreenContentCallback(new FullScreenContentCallback() { @Override public void onAdShowedFullScreenContent() { Window adWindow = getWindow(); if (adWindow != null) { // 关闭系统默认的内容适配,允许手动处理Insets WindowCompat.setDecorFitsSystemWindows(adWindow, false); View decorView = adWindow.getDecorView(); // 确保系统栏可见,这样才能正确获取Insets值 int uiFlags = View.SYSTEM_UI_FLAG_VISIBLE; decorView.setSystemUiVisibility(uiFlags); // 同方案1,设置Insets监听 ViewCompat.setOnApplyWindowInsetsListener(decorView, (view, insets) -> { WindowInsetsCompat.Type systemBars = WindowInsetsCompat.Type.systemBars(); view.setPadding( view.getPaddingLeft(), insets.getInsets(systemBars).top, view.getPaddingRight(), insets.getInsets(systemBars).bottom ); return insets; }); } } });
关键注意事项
- 插页广告的Window独立于宿主Activity,所以宿主的Insets设置不会自动生效,必须单独处理
WindowCompat.setDecorFitsSystemWindows(adWindow, false)是核心步骤,默认情况下广告Window会自动适配系统栏,但手动调整Insets时必须关闭这个默认行为- 测试时务必在带刘海、挖孔的真机上验证,确保广告内容完全避开系统栏区域
内容的提问来源于stack exchange,提问作者Sergey Emeliyanov
相关产品推荐
相关产品推荐

