web-dev-qa-db-fra.com

Android changer et définir les paramètres régionaux par défaut dans l'application

Je travaille sur la mondialisation de Android. Je dois fournir des options pour choisir différents paramètres régionaux à partir de l'application. J'utilise le code suivant dans mon activité (HomeActivity) où je fournis une option pour changer les paramètres régionaux

Configuration config = new Configuration();
config.locale = selectedLocale; // set accordingly 
// eg. if Hindi then selectedLocale = new Locale("hi");
Locale.setDefault(selectedLocale); // has no effect
Resources res = getApplicationContext().getResources();
res.updateConfiguration(config, res.getDisplayMetrics());

Cela fonctionne bien tant qu'il n'y a pas de changements de configuration comme la rotation de l'écran où les paramètres régionaux par défaut sont les Android paramètres régionaux au niveau du système plutôt que les paramètres régionaux définis par le code).

Locale.setDefault(selectedLocale);

Une solution à laquelle je peux penser est de conserver les paramètres régionaux sélectionnés par l'utilisateur à l'aide de SharedPreferences et, dans la méthode onCreate () de chaque activité, les paramètres régionaux sont définis sur les paramètres régionaux persistants car onCreate () est appelé à plusieurs reprises pour chaque modification de configuration. Y a-t-il une meilleure façon de le faire pour que je ne doive pas le faire dans chaque activité.

Fondamentalement, ce que je veux, c'est que - Une fois que j'ai changé/défini sur un paramètre régional dans mon HomeActivity, je veux que toutes les activités de mon application utilisent ce paramètre lui-même indépendamment de toute modification de configuration .... à moins que et jusqu'à ce qu'il soit changé pour un autre paramètre régional à partir de HomeActivity de l'application qui fournit des options pour modifier les paramètres régionaux.

21
Xavier DSouza

Bien que la solution indiquée dans cette réponse fonctionne dans le cas général, je me suis retrouvé à ajouter à mon écran de préférence:

 <activity Android:name="com.example.UserPreferences"
     Android:screenOrientation="landscape"
     Android:configChanges="orientation|keyboardHidden|screenSize">
 </activity>

En effet, lorsque l'application est en mode paysage et l'écran de préférence en mode portrait, la modification des paramètres régionaux et le retour à l'application peuvent provoquer des problèmes. Régler les deux en mode paysage empêche cela de se produire.

Solution générale

Vous devez modifier les paramètres régionaux au niveau de l'application, afin que ses effets soient partout.

public class MyApplication extends Application
{
  @Override
  public void onCreate()
  {
    updateLanguage(this);
    super.onCreate();
  }

  public static void updateLanguage(Context ctx)
  {
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
    String lang = prefs.getString("locale_override", "");
    updateLanguage(ctx, lang);
  }

  public static void updateLanguage(Context ctx, String lang)
  {
    Configuration cfg = new Configuration();
    if (!TextUtils.isEmpty(lang))
      cfg.locale = new Locale(lang);
    else
      cfg.locale = Locale.getDefault();

    ctx.getResources().updateConfiguration(cfg, null);
  }
}

Ensuite, dans votre manifeste, vous devez écrire:

<application Android:name="com.example.MyApplication" ...>
  ...
</application>
26
Mikaël Mayer