@weston と @rekire (両方とも +1) を組み合わせて、このユースケースを処理するように拡張しました。
- ActivityA => ActivityB => SettingsActivity-changeLocale
親アクティビティの後changeLocale
、新しいロケールを反映するために再作成する必要があります。SettingsActivity
ActivityA
ActivityB
私の解決策: ActivityA と ActivityBは、ロケールが変更された場合LocalizedActivity
にチェックインするものを継承し、必要に応じてトリガーしますonResume
recreate()
したがって、 を継承するすべてのアクティビティは、 LocalizedActivity
アプリ固有のロケールの変更を自動的に処理します。
/**
* An activity that can change the locale (language) of its content.
*
* Inspired by http://stackoverflow.com/questions/13181847/change-the-locale-at-runtime
*
* Created by k3b on 07.01.2016.
*/
public class LocalizedActivity extends Activity {
/** if myLocale != Locale.Default : activity must be recreated in on resume */
private Locale myLocale = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
fixLocale(this);
super.onCreate(savedInstanceState);
}
@Override
protected void onResume() {
super.onResume();
// Locale has changed by other Activity ?
if ((myLocale != null) && (myLocale.getLanguage() != Locale.getDefault().getLanguage())) {
myLocale = null;
recreate();
}
}
/**
* Set Activity-s locale to SharedPreferences-setting.
* Must be called before onCreate
* @param context
*/
public static void fixLocale(Context context)
{
final SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(context);
String language = prefs.getString(Global.PREF_KEY_USER_LOCALE, "");
Locale locale = Global.systemLocale; // in case that setting=="use android-locale"
if ((language != null) && (!language.isEmpty())) {
locale = new Locale(language); // overwrite "use android-locale"
}
if (locale != null) {
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
Resources resources = context.getResources();
resources.updateConfiguration(config, resources.getDisplayMetrics());
// recreate();
if (context instanceof LocalizedActivity) {
((LocalizedActivity) context).myLocale = locale;
}
}
}
}
私の A Photo Manager プロジェクトで使用されているLocalizedActivity.javaとSettingsActivity.javaのソースは次のとおりです。