1.创建一个SharedPreferencesHelper类来保存当前应用程序使用的区域设置/语言。
public class SharedPreferencesHelper { private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";
public static void setSelectedLanguage(Context context, String language) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
preferences.edit().putString(SELECTED_LANGUAGE, language).apply();
}
public static String getSelectedLanguage(Context context) {
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
return preferences.getString(SELECTED_LANGUAGE, "");
}
}
2.在应用程序的BaseActivity类中处理配置更改,包括更改语言和重启应用程序。
public abstract class BaseActivity extends AppCompatActivity { @Override protected void attachBaseContext(Context newBase) { super.attachBaseContext(LocaleHelper.onAttach(newBase)); }
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutResourceId());
//...
}
@Override
protected void onResume() {
super.onResume();
String language = SharedPreferencesHelper.getSelectedLanguage(this);
if (!language.equals("")) {
LocaleHelper.setLocale(this, language);
recreate();
}
}
}
3.创建一个LocaleHelper类来处理语言更改和保存当前语言设置。
public class LocaleHelper { private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";
public static Context onAttach(Context context) {
String language = SharedPreferencesHelper.getSelectedLanguage(context);
return setLocale(context, language);
}
public static Context setLocale(Context context, String language) {
SharedPreferencesHelper.setSelectedLanguage(context, language);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return updateResources(context, language);
}
return updateResourcesLegacy(context, language);
}
@TargetApi(Build.VERSION_CODES.N)
private static Context updateResources(Context context, String language) {
Locale locale = new Locale(language);
Configuration configuration = context.getResources().getConfiguration();
configuration.setLocale(locale);
return context.createConfigurationContext(configuration);
}
@SuppressWarnings("deprecation")
private static Context updateResourcesLegacy(Context context, String language) {
Locale locale = new Locale(language