Android N cambia el idioma mediante programación

He encontrado un error muy extraño que se reproduce sólo en dispositivos Android N.

En la gira de mi aplicación hay una posibilidad de cambiar de idioma. Aquí está el código que lo cambia.

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

Este código funciona muy bien en la actividad de mi tour (con la función recreate() ) pero en todas las próximas actividades todos los recursos de String están equivocados. La rotación de la pantalla lo arregla. ¿Qué puedo hacer con este problema? ¿Debo cambiar la configuración regional para Android N de forma diferente o solo es un error del sistema?

PS Esto es lo que encontré. Al principio de MainActivity (que es después de mi tour) Locale.getDefault() es correcto, pero los recursos están equivocados. Pero en otras actividades me da errores en la configuración regional y los recursos equivocados de esta configuración regional. Después de la pantalla de rotación (o tal vez algún otro cambio de configuración) Locale.getDefault() es correcto.

De acuerdo. Finalmente me las arreglé para encontrar una solución.

En primer lugar, debe saber que en 25 API Resources.updateConfiguration(...) está obsoleto. Así que en su lugar puede hacer algo como esto:

1) Usted necesita crear su propio ContextWrapper que anulará todos los parámetros de configuración en baseContext. Por ejemplo, esto es mío ContextWrapper que cambia la configuración regional correctamente. Preste atención al método context.createConfigurationContext(configuration) .

 public class ContextWrapper extends android.content.ContextWrapper { public ContextWrapper(Context base) { super(base); } public static ContextWrapper wrap(Context context, Locale newLocale) { Resources res = context.getResources(); Configuration configuration = res.getConfiguration(); if (BuildUtils.isAtLeast24Api()) { configuration.setLocale(newLocale); LocaleList localeList = new LocaleList(newLocale); LocaleList.setDefault(localeList); configuration.setLocales(localeList); context = context.createConfigurationContext(configuration); } else if (BuildUtils.isAtLeast17Api()) { configuration.setLocale(newLocale); context = context.createConfigurationContext(configuration); } else { configuration.locale = newLocale; res.updateConfiguration(configuration, res.getDisplayMetrics()); } return new ContextWrapper(context); }} 

2) Esto es lo que debe hacer en su BaseActivity:

  @Override protected void attachBaseContext(Context newBase) { Locale newLocale; // .. create or get your new Locale object here. Context context = ContextWrapper.wrap(newBase, newLocale); super.attachBaseContext(context); } 

Recuerde recrear su actividad si desea cambiar la configuración regional en su aplicación en algún lugar. Puede anular cualquier configuración que desee utilizando esta solución.

  • Cargando una imagen usando OpenCV en Android
  • Llamar a un método java desde c ++ en Android
  • ¿Para qué sirven los diferentes constructores de Intent?
  • Android Spinner - ¿Cómo hacer que la vista desplegable sea transparente?
  • Cómo agregar datos en secuencia de caracteres dinámicamente en java?
  • El documento no tiene excepción de elemento raíz utilizando el serializador xml simple (v2.6.6)
  • Agrega API de datos de Youtube en Android Studio usando Gradle
  • Decodificación de cadena utf-8
  • (Android) ¿Cómo obtengo SmartPhone ScreenWidth y Height?
  • El sonido de notificación no se reproduce cuando la pantalla del dispositivo está bloqueada
  • Problema del tutorial de Android First App
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.