Android切换设备语言后TextView显示异常,如何强制使用默认strings.xml?
解决Android应用强制使用葡萄牙语资源的问题
嘿,这个问题我之前帮人排查过,本质是Android的资源加载机制在设备语言匹配不到应用对应资源时,会触发fallback逻辑,导致意外加载了其他语言的字符串。咱们一步步来搞定它:
第一步:清理多余的语言资源文件夹
首先检查你的项目res目录下,有没有类似values-es、values-en这类带语言后缀的文件夹——如果有的话,直接删掉!因为Android会优先加载与设备语言匹配的资源文件夹里的内容,哪怕你没主动添加,也可能是第三方库或者误操作引入的。
第二步:强制应用全局使用葡萄牙语Locale
这是最稳妥的方式,不管系统设置什么语言,咱们直接把应用的默认Locale锁死在葡萄牙语。你需要在自定义的Application类里添加以下代码:
适配全版本的Locale设置代码
import android.app.Application; import android.content.res.Configuration; import android.os.Build; import java.util.Locale; public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); // 设置葡萄牙语(如果是欧洲葡萄牙语,把第二个参数改成"PT") Locale ptLocale = new Locale("pt", "BR"); Locale.setDefault(ptLocale); Configuration config = getResources().getConfiguration(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { // Android 7.0及以上需要处理LocaleList config.setLocale(ptLocale); config.setLocales(new LocaleList(ptLocale)); } else { config.setLocale(ptLocale); } // 更新配置 getResources().updateConfiguration(config, getResources().getDisplayMetrics()); } }
别忘了在AndroidManifest.xml的<application>标签里指定这个自定义Application:
<application android:name=".MyApp" ...> ... </application>
第三步:(可选)声明应用仅支持葡萄牙语
为了让系统更明确知道你的应用只支持葡萄牙语,可以添加一个locale配置文件:
- 在
res/xml目录下创建locale_config.xml(没有xml文件夹就新建一个) - 写入以下内容:
<?xml version="1.0" encoding="utf-8"?> <locale-config xmlns:android="http://schemas.android.com/apk/res/android"> <locale>pt</locale> <locale>pt-BR</locale> <!-- 可选,针对巴西葡萄牙语 --> </locale-config>
- 在
AndroidManifest.xml的<application>标签里引用它:
<application ... android:localeConfig="@xml/locale_config"> ... </application>
为什么会出现这个问题?
当设备语言设为西班牙语时,Android会先尝试寻找values-es下的字符串资源。如果找不到,它会沿着语言 fallback链去匹配(比如西班牙语和葡萄牙语同属罗曼语族,系统可能会优先匹配这类相近语言的资源),但如果你的应用里没有这些资源,就可能出现显示异常——而强制设置Locale后,应用会直接加载默认values/strings.xml里的葡萄牙语内容,完全跳过系统的语言匹配逻辑。
内容的提问来源于stack exchange,提问作者yasin
相关产品推荐
相关产品推荐

