web-dev-qa-db-fra.com

Impossible de changer de langue dans Oreo

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.

7
AFLAH ALI

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();
}
4
Alexey Denysenko

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);
}
1
gokhan

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

1
Zaid Mirza
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.

1
husen

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()

  }
1
Rajwinder Singh