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

Android API28下MainActivity点击切换Locale失效问题求助

Android API28 语言切换失效(仅能切换一次)问题修复

问题根源

你的代码存在几个关键问题导致语言切换异常:

  • 未持久化用户选择的语言,重启Activity后依赖系统默认Locale或Intent参数,容易出现状态丢失
  • 仅更新了ApplicationContext的配置,但未同步当前Activity的Resources配置,导致语言未立即生效
  • 重启Activity时未清除栈中旧实例,可能残留旧配置影响

修复方案

1. 添加语言持久化(SharedPreferences)

用SharedPreferences保存用户选择的语言,确保App重启后仍保留设置。

2. 正确更新Locale配置

在onCreate初期就应用保存的语言设置,而不是依赖Intent参数;同时更新当前Activity的Resources配置,确保语言立即生效。

3. 优化Activity重启逻辑

使用Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK清除栈中旧实例,避免配置冲突。

修改后的完整代码

private SharedPreferences sharedPreferences;
private Switch language;
private Button buttonPlay;
private String lang;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // 先加载保存的语言设置,再执行super.onCreate
    sharedPreferences = getSharedPreferences("AppSettings", MODE_PRIVATE);
    String savedLang = sharedPreferences.getString("selected_lang", null);
    if (savedLang != null) {
        setLocale(savedLang);
    } else {
        // 首次启动,读取系统默认语言
        if (Locale.getDefault().getLanguage().startsWith("it")) {
            lang = "ita";
        } else {
            lang = "eng";
        }
    }

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    language = findViewById(R.id.language);
    buttonPlay = findViewById(R.id.buttonPlay);

    // 根据当前语言设置Switch状态
    language.setChecked("ita".equals(lang));

    buttonPlay.setOnClickListener(view -> enterRoom());
    language.setOnCheckedChangeListener((compoundButton, isChecked) -> {
        lang = isChecked ? "ita" : "eng";
        // 保存语言设置
        sharedPreferences.edit().putString("selected_lang", lang).apply();
        setLocale(lang);
    });
}

private void setLocale(String lang) {
    Locale locale = new Locale(lang.substring(0, 2));
    Locale.setDefault(locale);

    Resources resources = getResources();
    Configuration configuration = resources.getConfiguration();
    configuration.setLocale(locale);
    // 更新当前Activity的Resources配置
    resources.updateConfiguration(configuration, resources.getDisplayMetrics());

    // 重启Activity,清除栈中旧实例
    Intent intent = new Intent(this, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    finish();
    startActivity(intent);
}

private void enterRoom() {
    // 你的enterRoom逻辑
}

关键修改点说明

  • 提前加载语言设置:在super.onCreate前执行语言配置,确保Activity启动时就应用正确的Locale
  • 持久化存储:用SharedPreferences保存用户选择,避免重启后丢失设置
  • 更新当前Resources:调用resources.updateConfiguration让当前Activity立即应用新语言
  • 优化重启Intent:使用FLAG清除栈中旧实例,防止旧配置干扰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 08:59:12