2012-04-13 8 views
13

tengo una actividad y en onCreate i cargar el lenguaje de las preferencias y establecer un escenario como éste:local androide cambia aleatoriamente a los valores predeterminados

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    String lang = PreferenceManager.getDefaultSharedPreferences(this).getString("locale", "en"); 
    Locale newLocale = new Locale(lang); 
    Locale.setDefault(newLocale); 

    Configuration config = new Configuration(); 
    config.locale = newLocale; 

    final Resources res = getResources(); 
    res.updateConfiguration(config, res.getDisplayMetrics()); 
} 

yo también anulan onConfigurationChanged

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    String lang = PreferenceManager.getDefaultSharedPreferences(this).getString("locale", "en"); 
    Locale newLocale = new Locale(lang); 
    Locale.setDefault(newLocale); 

    Configuration config = new Configuration(); 
    config.locale = newLocale; 

    final Resources res = getResources(); 
    res.updateConfiguration(config, res.getDisplayMetrics()); 
} 

tengo una ViewPager con FragmentPagerAdapter y tres pestañas en Android 2.3.7. el problema es que, a veces, al cambiar las pestañas, la configuración regional de la aplicación se revierte al inglés, por lo que a partir de ahora la interfaz de usuario tiene idiomas mixtos. Siempre creo nuevos fragmentos para las pestañas en el método getItem() del adaptador. si giro el dispositivo, la configuración regional vuelve a ser correcta.

También intenté poner android: configChanges = "locale" en manifiesto y no anulando enConfigurationChanged(), pero el resultado es el mismo.

Lo peor es que no es 100% reproducible, solo ocurre algunas veces y también tengo informes de usuarios sobre esto. una vez que se inicia la aplicación y no cambia la configuración regional después de cambiar algunas pestañas, entonces se aplicará correctamente hasta la salida.

Respuesta

10

Después de un tiempo, descubrí la manera. La única solución que funciona para mí siempre es establecer la configuración regional en OnCreate() de Acitivity principal, en onCreateView() de cada Fragmento, en onReceive() de cada BroadcastReceiver() (si carga algún recurso) y al inicio de cada Servicio. Para esto hice un método estático setLocale() en mi actividad principal y única. Si tiene más actividades, podría ubicarse en una clase de aplicación personalizada.

Una última cosa. Incluso esto algunas veces no funciona si la aplicación se inicia directamente desde IDE para la depuración. No se preocupe, funciona (al menos para mí) si se ejecuta normalmente en el dispositivo.

public static void setLocale(Context context) { 
    final String lang = PreferenceManager.getDefaultSharedPreferences(context).getString("locale", "en"); 
    final Locale newLocale = new Locale(lang); 
    Locale.setDefault(newLocale); 
    final Configuration config = new Configuration(); 
    config.locale = newLocale; 

    final Resources res = context.getResources(); 
    res.updateConfiguration(config, res.getDisplayMetrics()); 
} 
Cuestiones relacionadas