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

切换语言后AdMob广告不显示问题求助

解决AdMob广告在修改Locale后不显示的问题

看起来你遇到的问题是因为直接修改全局Resources的Configuration导致AdMob SDK的上下文环境出现异常——AdMob依赖于正确的应用上下文配置来加载和展示广告,全局修改Locale会干扰SDK的内部状态,尤其是重启Activity后,上下文的配置变更没有被AdMob正确感知,或者引发了加载逻辑的冲突。

问题根源

你当前的代码直接修改了应用全局的Resources配置,这种方式在Android 7.0(API 24)之后已经不推荐,因为它会影响整个应用的所有组件,包括第三方SDK(比如AdMob)的运行环境。AdMob SDK可能会缓存初始的上下文配置,或者在加载广告时依赖未被正确更新的上下文,导致广告无法正常请求和展示。

修复方案

推荐使用ContextWrapper来创建带有指定Locale的上下文,而不是直接修改全局Resources。这种方式只会影响你指定的组件,不会干扰全局环境,包括AdMob SDK的运行。

步骤1:创建LocaleContextWrapper工具类

import android.content.Context;
import android.content.ContextWrapper;
import android.os.Build;
import android.os.LocaleList;
import android.content.res.Configuration;
import java.util.Locale;

public class LocaleContextWrapper extends ContextWrapper {

    public LocaleContextWrapper(Context base, Locale locale) {
        super(base);
        Context context = updateLocale(base, locale);
        attachBaseContext(context);
    }

    private static Context updateLocale(Context context, Locale locale) {
        Locale.setDefault(locale);
        Configuration config = context.getResources().getConfiguration();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            config.setLocale(locale);
            LocaleList localeList = new LocaleList(locale);
            LocaleList.setDefault(localeList);
            config.setLocales(localeList);
            return context.createConfigurationContext(config);
        } else {
            config.locale = locale;
            context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
            return context;
        }
    }

    public static ContextWrapper wrap(Context context, Locale locale) {
        return new LocaleContextWrapper(context, locale);
    }
}

步骤2:在Activity中重写attachBaseContext方法

不要直接在代码里修改全局Resources,而是在每个需要切换Locale的Activity中,通过重写attachBaseContext来应用指定的Locale:

@Override
protected void attachBaseContext(Context newBase) {
    // 这里替换成你的目标Locale对象
    Locale targetLocale = localelanguage;
    super.attachBaseContext(LocaleContextWrapper.wrap(newBase, targetLocale));
}

步骤3:重启Activity的正确方式

当你需要切换Locale并重启Activity时,使用以下方式,确保新的上下文配置被正确应用:

Intent intent = getIntent();
finish();
startActivity(intent);
// 可选:清除过渡动画,避免视觉闪烁
overridePendingTransition(0, 0);

额外检查项

  • 确保AdMob的广告请求代码使用的是当前Activity的上下文(this),而不是全局的Application上下文,这样广告加载会使用正确的Locale配置。
  • 打开Logcat搜索AdMob相关日志,比如Ad failed to load的提示,根据具体错误信息排查(比如广告单元ID是否正确、网络是否正常、是否违反AdMob政策等)。

为什么这个方案有效?

通过ContextWrapper创建的上下文是局部的,只会影响当前Activity及其子组件,不会修改应用全局的Resources配置,这样AdMob SDK可以继续使用稳定的全局上下文环境(或者根据当前Activity的上下文正确加载广告),避免了全局配置修改带来的冲突。

内容的提问来源于stack exchange,提问作者Neo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:47:52