Android N changer la langue par programmation
Je l'ai trouvé vraiment bizarre bug qui est reproduit uniquement sur Android N appareils.
Au tour de mon application, il est possible de changer la langue. Voici le code qui change.
public void update(Locale locale) {
Locale.setDefault(locale);
Configuration configuration = res.getConfiguration();
if (BuildUtils.isAtLeast24Api()) {
LocaleList localeList = new LocaleList(locale);
LocaleList.setDefault(localeList);
configuration.setLocales(localeList);
configuration.setLocale(locale);
} else if (BuildUtils.isAtLeast17Api()){
configuration.setLocale(locale);
} else {
configuration.locale = locale;
}
res.updateConfiguration(configuration, res.getDisplayMetrics());
}
Ce code fonctionne très bien dans l'activité de mon tour ( avec recreate()
appel), mais dans toutes les prochaines activités de toutes les ressources de Chaîne sont mauvais. La rotation de l'écran fixe. Que puis-je faire avec ce problème? Dois-je changer les paramètres régionaux pour Android N différemment ou c'est juste le système de bug?
P. S. Voici ce que j'ai trouvé. Lors du premier démarrage de MainActivity (ce qui est après ma tournée) Locale.getDefault()
est correct, mais les ressources sont mauvais. Mais dans d'autres activités, il me donne mal de paramètres Régionaux et le mal les ressources de ce lieu. Après la rotation de l'écran (ou peut-être quelques autres changement de configuration) Locale.getDefault()
est correct.
- J'ai déposé un bug d'Android équipe et voici la réponse: code.google.com/p/android/issues/detail?id=225679
- Merci beaucoup! Cette réponse rly m'a aidé.
Vous devez vous connecter pour publier un commentaire.
Ok. Enfin j'ai réussi à trouver une solution.
Abord, vous devez savoir que dans 25 API
Resources.updateConfiguration(...)
est obsolète. Donc, au lieu de cela, vous pouvez faire quelque chose comme ceci:1) Vous devez créer votre propre ContextWrapper qui va l'emporter sur tous les paramètres de configuration dans baseContext. Par exemple, c'est la mienne ContextWrapper que les changements de paramètres Régionaux correctement. Attention sur
context.createConfigurationContext(configuration)
méthode.2) Voici ce que vous devez faire dans votre BaseActivity:
Remarque:
Locale locale = ((YourAppClass)newBase).getLocale();
newBase dans attachBaseContext méthode est u êtes à la Demande de la classe u peut le jeter. Ou vous pouvez utiliser Dagger2 ici en quelque sorte.setLocale()
sur le nouveau contexte après l'appel decontext = context.createConfigurationContext(config);
. Qu'il a fait pour moi.onConfigurationChanged()
. L'ajout deattachBaseContext()
les causes de cette. Aucun moyen pour résoudre ce problème au lieu de passer d'un événement à partir de l'Activité à vue dans cette affaire?attachBaseContext
mais avec différents paramètres. Comment puis-je faire face à cette situation? Ma Question est ici stackoverflow.com/questions/48926729/...Inspiré par les différents codes (j'.e: notre Stackoverflow équipe (crier les gens)), j'avais produit une version beaucoup plus simple. Le
ContextWrapper
extension est inutile.D'abord disons que vous avez 2 boutons pour les 2 langues, FR et KH. Dans le onClick pour les boutons enregistrer le code de langue dans
SharedPreferences
, puis appelez l'activitérecreate()
méthode.Exemple:
Puis créer une méthode statique qui renvoie
ContextWrapper
, peut-être dans une classe Utils (coz c'est ce que j'ai fait, lul).Enfin, charger le code de langue à partir de
SharedPreferences
dans TOUTES les ACTIVITÉS DUattachBaseContext(Context newBase)
méthode.BONUS: Pour économiser la paume de la sueur sur le clavier, j'ai créé un
LangSupportBaseActivity
classe qui étend laActivity
et utiliser le dernier bloc de code. Et j'ai toutes les autres activités s'étendLangSupportBaseActivity
.Exemple:
if (!lang_code.equals("") && !sysLocale.getLanguage().equals(lang_code))
vérifier parce que, après un changement (par l'utilisateur dans les paramètres, par exemple), parfoissysLocale.getLanguage()
était d'avoir la valeur de la langue, mais de ne pas définir explicitement les paramètres régionaux résultant de la langue ne change pas.Les réponses ci-dessus m'ont mis sur la bonne piste, mais a laissé un couple de questions
De fixer le premier article que j'ai stocké les paramètres régionaux par défaut sur l'application de démarrage.
Note Si votre langue par défaut est réglé sur "fr", puis les lieux de "frfr" ou "frfr" les deux besoin de faire correspondre les paramètres régionaux par défaut (sauf si vous fournissez de séparer les localisations pour eux). De même, dans l'exemple ci-dessous si le téléphone de l'utilisateur paramètres régionaux est d'arLY (arabe Libyenne) puis le defLanguage doit être "ar" pas "d'arLY"
Pour résoudre le RTL questions, j'ai étendu AppCompatActivity que par des Fragments de commentaires dans ce réponse