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

API 25中Resources已被弃用,现有多语言配置代码该如何修改?

解决API 25+中Resources构造器废弃的多语言配置问题

嘿,我来帮你搞定这个问题!从API 25开始,new Resources(Assets, DisplayMetrics, Configuration)这个构造方法确实被标记为废弃了,官方推荐通过Context的配置上下文来获取适配后的Resources实例,这样不仅能避免废弃API的使用,还能更好地兼容高版本Android系统。

修改后的代码

我调整了你的代码,同时兼顾了旧版本兼容性和新版本的最佳实践:

public Resources getResources(Context context) {
    Resources originalResources = context.getResources();
    Locale targetLocale = LanguageSetting.getLanguage(context);
    Configuration newConfig = new Configuration(originalResources.getConfiguration());

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        // API 17及以上,使用官方推荐的createConfigurationContext方法
        newConfig.setLocale(targetLocale);
        Context updatedContext = context.createConfigurationContext(newConfig);
        return updatedContext.getResources();
    } else {
        // API 17以下,保留旧方式(该版本构造器未被废弃)
        newConfig.locale = targetLocale;
        DisplayMetrics metrics = originalResources.getDisplayMetrics();
        return new Resources(context.getAssets(), metrics, newConfig);
    }
}

关键修改点说明

  • 替换废弃构造器:不再直接new Resources(),而是用context.createConfigurationContext(newConfig)创建适配指定语言的上下文,再从中获取Resources,这是API17+官方推荐的标准方式。
  • 参数优化:把原来的Resources参数改成Context,这样我们能更灵活地获取所需的资源和创建上下文,如果你一定要保留原参数签名,也可以从传入的Resources反向获取Context(resources.getContext()),但直接传Context是更合理的实践。
  • 版本兼容:对API17以下的旧系统保留原逻辑,确保低版本设备正常运行。

额外提示(针对高版本Android)

如果你的应用需要适配API26+,还要注意:

  • 应用内语言切换后,需要重启当前Activity才能让配置生效
  • 可以在Application类中重写attachBaseContext方法,全局持久化语言配置,避免系统语言变化影响应用内设置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:27:28