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?
- Use locale (ltr / rtl) para gravedad en TextView
- Desarrollo de una aplicación de Android de derecha a izquierda
- los elementos del lugar de visualización de la cuadrícula de Android de derecha a izquierda
- Cambiar EditText setError gravedad dibujable
- ¿Cómo cambiar la fuente del cajón de navegación?
Antes de que esto fuera hecho por:
Configuration config = getBaseContext().getResources().getConfiguration(); config.setLocale(locale); context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
- El soporte de diseño de derecha a izquierda está causando problemas de advertencia en el editor de xml
- Cadena RTL hebrea de Android con valor numérico volteado
- Identificar el idioma RTL en Android
- Cómo configurar el cajón de navegación para que se abra de derecha a izquierda
- Alineación derecha de Android TextView en un dispositivo de derecha a izquierda
- ¿Cómo manejar los idiomas RTL en las versiones anteriores a la versión 4.2 de Android?
- La pantalla parpadea cuando se ejecuta en Android 4.2. (La actividad se reinicia continuamente)
- ¿Cómo posiciono el cursor a la derecha en EditText
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
- ActionBarSherlock 4.0 no funciona. Pero 3.5.1 hacer
- Android studio 2.2 editor de diseño botón de actualización