J'essaie d'utiliser l'arabe et l'anglais dans mon application. Son bon fonctionnement sur les appareils fonctionnant sur nougat ou en dessous. Mais cela ne fonctionne pas sur les périphériques Oreo. Y a-t-il une nouvelle exigence de code dans l'API 26? J'utilise le code ci-dessous.
public void changeLanguage(Context context, String language) {
Locale locale = new Locale(language);
Locale.setDefault(locale);
Configuration config = context.getResources().getConfiguration();
config.setLocale(locale);
context.createConfigurationContext(config);
context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
}
et je passe "en" et "ar" comme argument linguistique.
Lorsque vous définissez new Locale
, vous devez redémarrer votre Activity
. Vous pouvez l'exécuter en utilisant le prochain extrait de code:
private void restartActivity() {
Intent intent = getIntent();
finish();
startActivity(intent);
}
Ensuite, votre méthode changeLanguage()
ressemblera à une autre façon:
public void changeLanguage(Context context, String language) {
Locale locale = new Locale(language);
Locale.setDefault(locale);
Configuration config = context.getResources().getConfiguration();
config.setLocale(locale);
context.createConfigurationContext(config);
context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
restartActivity();
}
J'ai eu le même problème avant et après quelques recherches, je trouve une solution. Créez un wrapper contextuel sensible à la langue et attachez-le à la méthode attachBaseContext () de votre activité.
@SuppressWarnings("NewApi")
public static LanguageAwareContext newLanguageAwareContext(String targetLanguage, Context context) {
Resources resources = context.getResources();
Configuration configuration = resources.getConfiguration();
Locale newLocale = new Locale(targetLanguage);
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
configuration.setLocale(newLocale);
LocaleList.setDefault(new LocaleList(newLocale));
context = context.createConfigurationContext(configuration);
} else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR1) {
configuration.setLocale(newLocale);
context = context.createConfigurationContext(configuration);
} else {
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
}
return new LanguageAwareContext(context);
}
override attachBaseContext method et change avec votre wrapper de contexte personnalisé
@Override
protected void attachBaseContext(Context newBase) {
newBase = LanguageAwareContext.newLanguageAwareContext("en",newBase);
super.attachBaseContext(newBase);
}
J'ai récemment été confronté à un problème lié à la mise en page sur Oreo
. Les ressources étaient en cours de mise à jour mais l'orientation de la disposition ne changeait pas.
Le code ci-dessous a fonctionné pour moi.
public static void setRTLSupportIfRequired(AppCompatActivity activity) {
if(getLanguageFromPrefs(activity).equals("ar")) {
activity.getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
}else{
activity.getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
}
}
Note: Auparavant, j'utilisais View.LAYOUT_DIRECTION_LOCALE
mais cela ne fonctionnait pas sur Oreo
Locale locale = new Locale(lang);
Locale.setDefault(locale);
Configuration config = new Configuration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
config.setLocale(locale);
} else {
config.locale = locale;
}
context.getApplicationContext().getResources().updateConfiguration(config,
context.getApplicationContext().getResources().getDisplayMetrics());
Cela a fonctionné pour moi.
Oui, il y a un problème avec Android Oreo pour le changement de langue ( les chaînes et la mise en forme en arabe, ourdou et hébreu ), j'ai trouvé la solution qui vous aidera à résoudre ce problème.
Dans la classe LanguageContextWrapper.Java
public static ContextWrapper wrap(Context context, String language) {
Locale locale = new Locale(language);
Locale.setDefault(locale);
Resources resources = context.getResources();
Configuration configuration = resources.getConfiguration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
configuration.setLocale(locale);
LocaleList localeList = new LocaleList(locale);
LocaleList.setDefault(localeList);
configuration.setLocales(localeList);
configuration.setLayoutDirection(locale);
context.createConfigurationContext(configuration);
} else {
configuration.locale = locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
configuration.setLayoutDirection(locale);
}
}
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
return new LanguageContextWrapper(context);
}
Dans la classe d'activité, remplacement de la méthode suivante
override fun attachBaseContext(base: Context) {
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
super.attachBaseContext(LanguageContextWrapper.wrap(base, Locale.getDefault().language))
} else {
super.attachBaseContext(base)
}
}
Et après le changement de langue, nous devons recréer l'activité, nous devons écrire le code suivant
fun recreateActivity(){
if (Build.VERSION.SDK_INT in 26..27) {
if (Locale.getDefault().language == "ar" ||
Locale.getDefault().language == "iw" ||
Locale.getDefault().language == "ur")
window.decorView.layoutDirection = View.LAYOUT_DIRECTION_RTL
else
window.decorView.layoutDirection = View.LAYOUT_DIRECTION_LTR
}
recreate()
}