Inspiré par la Calligraphie, j'ai fini par créer un wrapper de contexte.
Dans mon cas, j'ai besoin de remplacer le système de la langue de fournir à mes utilisateurs de l'application avec la possibilité de changer d'application de la langue, mais ce qui peut être personnalisé avec toute la logique que vous avez besoin de mettre en œuvre.
import android.annotation.TargetApi;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.res.Configuration;
import android.os.Build;
import java.util.Locale;
public class MyContextWrapper extends ContextWrapper {
public MyContextWrapper(Context base) {
super(base);
}
@SuppressWarnings("deprecation")
public static ContextWrapper wrap(Context context, String language) {
Configuration config = context.getResources().getConfiguration();
Locale sysLocale = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
sysLocale = getSystemLocale(config);
} else {
sysLocale = getSystemLocaleLegacy(config);
}
if (!language.equals("") && !sysLocale.getLanguage().equals(language)) {
Locale locale = new Locale(language);
Locale.setDefault(locale);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
setSystemLocale(config, locale);
} else {
setSystemLocaleLegacy(config, locale);
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
context = context.createConfigurationContext(config);
} else {
context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
}
return new MyContextWrapper(context);
}
@SuppressWarnings("deprecation")
public static Locale getSystemLocaleLegacy(Configuration config){
return config.locale;
}
@TargetApi(Build.VERSION_CODES.N)
public static Locale getSystemLocale(Configuration config){
return config.getLocales().get(0);
}
@SuppressWarnings("deprecation")
public static void setSystemLocaleLegacy(Configuration config, Locale locale){
config.locale = locale;
}
@TargetApi(Build.VERSION_CODES.N)
public static void setSystemLocale(Configuration config, Locale locale){
config.setLocale(locale);
}
}
et pour injecter votre enveloppe, dans chaque activité, ajoutez le code suivant:
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(MyContextWrapper.wrap(newBase,"fr"));
}
Mise à JOUR 10/19/2018
Parfois, après un changement d'orientation, ou de l'activité mettre en pause/reprendre la Configuration de l'objet se remet à défaut de la Configuration du système et dans la suite, nous verrons l'application de l'affichage en anglais "fr" texte même si nous avons terminé le contexte français "fr" locale. Par conséquent, et comme une bonne pratique, ne jamais conserver le Contexte/l'Activité de l'objet dans une variable globale dans des activités ou des fragments.
en outre, de créer et d'utiliser les éléments suivants dans un MyBaseFragment ou MyBaseActivity:
public Context getMyContext(){
return MyContextWrapper.wrap(getContext(),"fr");
}
Cette pratique va vous fournir 100% sans bug solution.