web-dev-qa-db-fra.com

Changer de langue sans redémarrer l'activité

J'ai une méthode qui traduit mon application de l'anglais en suédois et inversement si l'utilisateur le souhaite. Cependant, je n'aime pas vraiment le fait que l'activité redémarre à chaque fois, car cela me rend difficile avec la variable savedInstaceState et j'ai eu plusieurs accidents à cause de cela. 

Voici à quoi ressemble ma méthode qui change de langue:

public void setApplicationLanguage(String language) {
    myLocale = new Locale(language);
    Resources res = activity.getResources();
    DisplayMetrics display = res.getDisplayMetrics();
    Configuration configuration = res.getConfiguration();
    configuration.locale = myLocale;
    res.updateConfiguration(configuration, display);
    Intent refresh = new Intent(activity, StartupActivity.class);
    activity.startActivity(refresh);
} 

Existe-t-il une chance que la même fonction puisse être appliquée sans le:

Intent refresh = new Intent(activity, StartupActivity.class);
activity.startActivity(refresh);

?

5

Vous pouvez remplacer le code:

Intent refresh = new Intent(activity, StartupActivity.class);
activity.startActivity(refresh);

Avec la méthode de la classe d'activité:

recreate();

J'espère que votre version minimale du SDK prendra en charge car elle a été introduite dans le SDK 11. Votre activité sera recréée comme une nouvelle instance. Tout sera recommencé. D'après mon expérience, il est rapide comparé à la création d'une nouvelle Intent. Mais si vous voulez transmettre des données, la méthode d'utilisation de Intent est meilleure que celle! Vous pouvez ajouter des extras à la Intent.

4
Xenolion

Essaye ça

  • J'ai aussi eu ce problème. J'ai utilisé le code ci-dessous, puis il a changé de langue sans actualiser l'activité.

public void setLocale(String lang) {

myLocale = new Locale(lang);
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, dm);
onConfigurationChanged(conf);
/*Intent refresh = new Intent(this, AndroidLocalize.class);
startActivity(refresh);*/
  }

@Override
public void onConfigurationChanged(Configuration newConfig) {
  // refresh your views here
    lblLang.setText(R.string.langselection);
  super.onConfigurationChanged(newConfig);
// Checks the active language
if (newConfig.locale == Locale.ENGLISH) {
    Toast.makeText(this, "English", Toast.LENGTH_SHORT).show();
} else if (newConfig.locale == Locale.FRENCH){
    Toast.makeText(this, "French", Toast.LENGTH_SHORT).show();
}
  }

  • déclarer dans Manifest Android:configChanges="locale"
3
Vishal Yadav

Créez une classe singleton:

public class Singleton {
   private static Singleton mInstance = null;

   private int repeat = 0;

   public int getRepeat() {
      return repeat;
   }

   public void setRepeat(int repeat) {
      this.repeat = repeat;
   }
}

Maintenant vous avez une méthode que vous pouvez définir et obtenir les données, alors créez une méthode et mettez-la sous la méthode onResume(), appelez votre méthode et vous pouvez obtenir et définir les données comme suit:

Singleton.getInstance().setRepeat(1);
Singleton.getInstance().getRepeat();                        
1
SAVVY