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

为何我的Android应用仅单个Activity切换语言,其余页面不变?

解决Android仅当前Activity语言切换生效的问题

你的问题很常见——这段代码只修改了当前Activity的资源配置,没有全局生效,而且重启其他页面时系统会复用默认的配置。下面是完整的解决方案,分步骤来:

1. 持久化用户的语言选择

首先得把用户选的语言存起来,不然重启App或者打开新页面时会回到系统默认语言。用SharedPreferences就很合适:

// 保存选中的语言到SharedPreferences
private void saveSelectedLanguage(String languageCode) {
    SharedPreferences prefs = getSharedPreferences("AppLanguageSettings", MODE_PRIVATE);
    prefs.edit().putString("selected_language", languageCode).apply();
}

// 从SharedPreferences获取保存的语言,默认用系统语言
public static String getSavedLanguage(Context context) {
    SharedPreferences prefs = context.getSharedPreferences("AppLanguageSettings", MODE_PRIVATE);
    return prefs.getString("selected_language", Locale.getDefault().getLanguage());
}

2. 修改语言切换方法,加入持久化并兼容高版本API

更新你的changeLanguage方法,先保存语言设置,再处理配置更新,同时兼容Android N及以上版本的API变化:

private void changeLanguage(String stringLanguage){
    // 先保存用户选择的语言
    saveSelectedLanguage(stringLanguage);

    Locale targetLocale = new Locale(stringLanguage);
    Locale.setDefault(targetLocale);

    Configuration config = getResources().getConfiguration();
    // 适配Android N及以上的API
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        config.setLocale(targetLocale);
        // 创建新的配置上下文,更可靠
        Context updatedContext = createConfigurationContext(config);
        getResources().updateConfiguration(config, getResources().getDisplayMetrics());
    } else {
        config.locale = targetLocale;
        getResources().updateConfiguration(config, getResources().getDisplayMetrics());
    }

    // 重启当前页面,同时清除栈内其他页面,避免返回时回到旧语言的Activity
    Intent refreshIntent = new Intent(ActLanguage.this, ActLanguage.class);
    refreshIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(refreshIntent);
    finish();
}

3. 全局统一处理语言配置(核心步骤)

要让所有Activity都应用语言设置,最好创建一个BaseActivity,所有页面都继承它,然后在attachBaseContext方法里统一加载保存的语言配置——这个方法会在每个Activity创建前被调用,能确保页面启动时就用正确的语言:

public class BaseActivity extends AppCompatActivity {
    @Override
    protected void attachBaseContext(Context newBase) {
        // 获取保存的语言设置
        String savedLanguage = getSavedLanguage(newBase);
        Locale targetLocale = new Locale(savedLanguage);
        Locale.setDefault(targetLocale);

        Configuration config = newBase.getResources().getConfiguration();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            config.setLocale(targetLocale);
            // 创建更新后的上下文
            newBase = newBase.createConfigurationContext(config);
        } else {
            config.locale = targetLocale;
            newBase.getResources().updateConfiguration(config, newBase.getResources().getDisplayMetrics());
        }

        super.attachBaseContext(newBase);
    }
}

之后,把你的ActLanguage和其他所有Activity都改成继承BaseActivity,这样不管打开哪个页面,都会自动应用保存的语言设置了。

为什么原来的代码无效?

你之前的代码只修改了当前Activity的Resources配置,但其他Activity启动时会使用Application的默认配置,没有被更新。而且没有持久化设置,重启App后又会回到系统默认语言。通过上面的步骤,既持久化了用户选择,又在每个Activity创建前统一加载配置,就能实现全局语言切换的效果了。

内容的提问来源于stack exchange,提问作者Fabián Romo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:24:09