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
相关产品推荐
相关产品推荐

