web-dev-qa-db-fra.com

Changer les paramètres régionaux: Forcer l'activité à recharger des ressources?

J'ai donc un paramètre de langue dans mon application. Lorsque la langue est changée, je voudrais que toutes les vues de texte, etc. changent de langue immédiatement. Actuellement, je viens de changer les paramètres régionaux dans la configuration, de sorte que la langue a changé lorsque l'utilisateur redémarre l'activité.

Une mauvaise solution à mon problème serait de faire en sorte que chaque affichage de texte charge les nouvelles ressources à chaque changement de langue. Y a-t-il une meilleure solution? Peut-être un bon moyen de redémarrer discrètement l'activité? Ou peut-être juste forcer le rechargement des ressources?

24
pgsandstrom

Dans votre AndroidManifest.xml, ajoutez cet attribut à votre activité. 

Android:configChanges="locale"

Dans votre activité, remplacez onConfigurationChanged()

@Override
public void onConfigurationChanged(Configuration newConfig) {
  // refresh your views here
  super.onConfigurationChanged(newConfig);
}

https://developer.Android.com/guide/topics/manifest/activity-element.html#config

17
Jim Blackler

Je pense que la question est de changer de langue dans l'exécution pour l'application et d'afficher des messages localisés dans l'interface utilisateur. Android:configChanges="locale" appelle onConfigurationChanged si les paramètres régionaux du système sont modifiés (en fonction de votre appareil) lorsque l'application est en cours d'exécution, et non si vous modifiez les paramètres régionaux dans le code de votre application, ce qui, je suppose, est ce que vous souhaitez accomplir. C'est pourquoi ce n'est pas rafraîchissant.

9
MSquare

Voici la méthode que j'utilise lors de chaque activité onCreate () ou onResume () en fonction de mes besoins (si mon activité reprend après que l'utilisateur a modifié les paramètres de langue ou sera toujours créée avec la langue déjà définie):

À partir de là, je viens d'actualiser la vue manuellement ou à partir de onConfigurationChanged (), appelé après la fin de cette méthode.

public static void changeLocale(Activity activity, String language)
{
    final Resources res = activity.getResources();
    final Configuration conf = res.getConfiguration();
    if (language == null || language.length() == 0)
    {
        conf.locale = Locale.getDefault();
    }
    else
    {
        final int idx = language.indexOf('-');
        if (idx != -1)
        {
            final String[] split = language.split("-");
            conf.locale = new Locale(split[0], split[1].substring(1));
        }
        else
        {
            conf.locale = new Locale(language);
        }
    }

    res.updateConfiguration(conf, null);
}
7
3c71

Je ne suis pas sûr de savoir pourquoi cela n'est pas repris par onConfigurationChanged().

Salut, sandis, tu veux dire que la méthode onConfigurationChanged() n’appelle pas dans ton activité lorsque tu as changé de langue? J'ai rencontré le même problème. Le problème est peut-être le suivant: lorsque nous changeons de langue, l'activité passe à onDestroy() (vous pouvez essayer ceci), il n'y a donc personne à appeler onConfigurationChanged(). Lorsque nous relançons l'activité, la onCreate() est appelée et non la onConfigurationChanged(). Il peut y avoir quelque chose de différent dans le changement de lieu et le changement d'orientation.

0
himalayagiant
public void settingLocale(Context context, String language) {

Locale locale;

Configuration config = new Configuration();

 if(language.equals(LANGUAGE_ENGLISH)) {

    locale = new Locale("en");

    Locale.setDefault(locale);

    config.locale = locale;

}else if(language.equals(LANGUAGE_ARABIC)){

    locale = new Locale("hi");

    Locale.setDefault(locale);

    config.locale = locale;

}

context.getResources().updateConfiguration(config, null);

// Here again set the text on view to reflect locale change

// and it will pick resource from new locale

tv1.setText(R.string.one); //tv1 is textview in my activity

}
0
ubhusri