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.
- ¿Cómo conectar un socket SSL a través de un proxy HTTP?
- Hex to String en Java El rendimiento es demasiado lento
- Uso de la batería, ¿qué esperar?
- Utilizar FragmentStatePagerAdapter sin biblioteca de soporte
- Leer archivo de texto remoto en android
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.
- Reflexión para un campo que va mal
- Biometría de voz para Android
- Sprite Rotación alrededor de un punto Andengine / Java
- ¿Cómo obtener el número de días entre dos instancia de calendario?
- Cómo acceder a setPreferredNetworkType en la fuente de Android
- Para cada uno dentro de un para cada - Java
- Android Studio: Crea un punto de interrupción de excepción bien comportado
- Pasa la variable entre la clase de no actividad a la clase de actividad de Android
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.
- Error: No se pudo encontrar la propiedad 'assembleDebug' en el proyecto ': app'
- ¿Cómo llamar a los métodos de un servicio de la actividad?