Android context.getResources.updateConfiguration () desaprobado

Hace poco context.getResources (). UpdateConfiguration () ha quedado obsoleto en la API de Android 25 y se aconseja utilizar el contexto. CreateConfigurationContext () en su lugar.

¿Alguien sabe cómo se puede usar createConfigurationContext para anular la configuración regional del sistema android?

Antes de que esto fuera hecho por:

Configuration config = getBaseContext().getResources().getConfiguration(); config.setLocale(locale); context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics()); 

Inspirado por la caligrafía , terminé creando una envoltura del contexto. En mi caso, necesito sobrescribir el lenguaje del sistema para proporcionar a mis usuarios de la aplicación la opción de cambiar el idioma de la aplicación, pero esto se puede personalizar con cualquier lógica que necesite implementar.

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

Y para inyectar su envoltorio, en cada actividad agregue el siguiente código:

 @Override protected void attachBaseContext(Context newBase) { super.attachBaseContext(MyContextWrapper.wrap(newBase,"fr")); } 

Probablemente así:

 Configuration overrideConfiguration = getBaseContext().getResources().getConfiguration(); overrideConfiguration.setLocales(LocaleList); Context context = createConfigurationContext(overrideConfiguration); Resources resources = context.getResources(); 

Bonus: Un artículo de blog que utiliza createConfigurationContext ()

Prueba esto:

 Configuration config = getBaseContext().getResources().getConfiguration(); config.setLocale(locale); context.createConfigurationContext(config); 

Hay una solución simple con contextWrapper aquí: Android N cambia el lenguaje programatically Preste atención al método recreate ()

Inspirado por la caligrafía & Mourjan y yo, yo creé esto.

Primero debes crear una subclase de Aplicación:

 public class MyApplication extends Application { private Locale locale = null; @Override public void onCreate() { super.onCreate(); SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); Configuration config = getBaseContext().getResources().getConfiguration(); String lang = preferences.getString(getString(R.string.pref_locale), "en"); String systemLocale = getSystemLocale(config).getLanguage(); if (!"".equals(lang) && !systemLocale.equals(lang)) { locale = new Locale(lang); Locale.setDefault(locale); setSystemLocale(config, locale); updateConfiguration(config); } } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (locale != null) { setSystemLocale(newConfig, locale); Locale.setDefault(locale); updateConfiguration(newConfig); } } @SuppressWarnings("deprecation") private static Locale getSystemLocale(Configuration config) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { return config.getLocales().get(0); } else { return config.locale; } } @SuppressWarnings("deprecation") private static void setSystemLocale(Configuration config, Locale locale) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { config.setLocale(locale); } else { config.locale = locale; } } @SuppressWarnings("deprecation") private void updateConfiguration(Configuration config) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { getBaseContext().createConfigurationContext(config); } else { getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); } } } 

Entonces necesitas establecer esto en la etiqueta de tu aplicación AndroidManifest.xml:

 <application ... android:name="path.to.your.package.MyApplication" > 

Y agregue esto a su etiqueta de actividad AndroidManifest.xml.

 <activity ... android:configChanges="locale" > 

Tenga en cuenta que pref_locale es un recurso de cadena como este:

 <string name="pref_locale">fa</string> 

Y hardcode "es" es el idioma por defecto si pref_locale no está establecido

  • Android: cambia las direcciones completas de la distribución de la aplicación mediante programación
  • ViewPager para diapositivas de pantalla de derecha a izquierda
  • ¿Cómo evitar la dirección automática de texto de derecha a izquierda para el hebreo y el árabe?
  • Android: es el apoyo de diseño de restricciones RTL
  • RTL se fuerza en dispositivos RTL
  • ¿Cuál es el estado de los idiomas de Right To Left en Android?
  • el cursor en la pista EditText no comienza desde la derecha para el árabe
  • ¿Cómo puedo forzar mi aplicación Android a ejecutar sólo con RTL layout directon?
  • Anular los soportesRtl en uno de los diseños
  • Cómo crear RTL ViewPager?
  • Integración de Android Hebrew (RTL)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.