言語(英語とポルトガル語)を切り替えるオプションが1つの簡単な設定画面を追加したいアンドロイドアプリがあります。私はすでに適切な文字列リソースファイルを用意しています。Android N - ランタイムでのロケールの変更
システム環境設定でOSのメイン言語を変更してアプリケーションをリロードすると、その言語が使用されますが、設定画面で実行したいと考えています。
これまでのAndroidバージョンではこれがずっと簡単でしたが、そのコードは廃止されているので、すべてのアクティビティでattachBaseContextメソッドをオーバーライドしてコンテキストを再作成するというアプローチに従った私はこの記事に見られるように、ロケールは現在、環境設定で選択したロードするラッパー:プリファレンスを変更するときに私の理解にとても
Android N change language programatically
public class TCPreferenceActivity extends PreferenceActivity implements SharedPreferences.OnSharedPreferenceChangeListener {
@Override
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.headers_preference, target);
}
@Override
protected boolean isValidFragment(String fragmentName) {
return TCPreferenceFragment.class.getName().equals(fragmentName);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals("lang")) {
recreate();
}
}
@Override
protected void attachBaseContext(Context newBase) {
SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(newBase);
String lang = pref.getString("lang", null);
Locale locale = new Locale(lang);
Context context = TCContextWrapper.wrap(newBase, locale);
super.attachBaseContext(context);
}
}
は、onSharedPreferenceChangedメソッドが呼び出されます。そこでの活動を再現して、新しい文脈で再開できるようにします。
これは私のコンテキストラッパーです:私はのonChangeメソッドが呼び出されることがわかります
public class TCContextWrapper extends ContextWrapper {
public TCContextWrapper(Context base) {
super(base);
}
public static ContextWrapper wrap(Context context, Locale newLocale) {
Resources res = context.getResources();
Configuration configuration = res.getConfiguration();
if (android.os.Build.VERSION.SDK_INT >= 24) {
configuration.setLocale(newLocale);
LocaleList localeList = new LocaleList(newLocale);
LocaleList.setDefault(localeList);
configuration.setLocales(localeList);
context = context.createConfigurationContext(configuration);
} else if (android.os.Build.VERSION.SDK_INT >= 17) {
configuration.setLocale(newLocale);
context = context.createConfigurationContext(configuration);
} else {
configuration.locale = newLocale;
res.updateConfiguration(configuration, res.getDisplayMetrics());
}
return new ContextWrapper(context);
}
}
デバッグ、好みの活動が再作成され、コンテキストラッパーが呼び出され、新しいロケールの値が正しくラッパーで作成されましたアクティビティが開始されると、私は同じデフォルト文字列を見続けます。
あなたがLocale
オブジェクトに対して設定されている
それはまさにそれです。 –