You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:28:14