为何我的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
相关产品推荐
相关产品推荐

