2012-09-01 21 views
16

Chcę pozwolić użytkownikowi zmienić język mojej aplikacji za pomocą pokrętła (lub w jakikolwiek sposób). Próbowałem na wiele sposobów, ale one zmieniają język tego działania, a nie wszystkie działania i chcę je zapisać, aby po ponownym uruchomieniu aplikacji użytkownik znalazł ostatnio wybrany język.Android, jak zmienić język aplikacji w czasie wykonywania

Odpowiedz

31

można użyć tego kodu w pokrętła lub dowolny sposób

String languageToLoad = "en"; // your language 
Locale locale = new Locale(languageToLoad); 
Locale.setDefault(locale); 
Configuration config = new Configuration(); 
config.locale = locale; 
getBaseContext().getResources().updateConfiguration(config, 
getBaseContext().getResources().getDisplayMetrics()); 

następnie należy zapisać się języka jak ten

SharedPreferences languagepref = getSharedPreferences("language",MODE_PRIVATE); 
SharedPreferences.Editor editor = languagepref.edit(); 
editor.putString("languageToLoad",languageToLoad); 
editor.commit(); 

i użytkowania ten sam kod w każdej czynności w onCreate(), aby załadować z SharedPreferences

+0

Czy ta zmiana będzie obowiązywać w całym systemie Android, czy zmieni się tylko w przypadku aplikacji? Pytam o to, aby użytkownik opuszczający aplikację mógł kontynuować działanie z domyślnym językiem androida –

+0

@KarueBensonKarue zmieni się tylko w aplikacji. –

+0

Dobrze, dziękuję za odpowiedź –

5

Użyj SharedPreferences, aby śledzić język wybrany przez użytkownika, a następnie ustaw działania, aby używać tego języka w metodzie onCreate(), a może onResume(). W ten sposób będzie się utrzymywać w poprzek uruchomieniu aplikacji itp

+1

czy wszyscy deweloperzy używają tej aplikacji tam, czuję, że nie jest to zbyt jasne! –

+1

Nie mogę mówić za innych programistów, ponieważ nie mam dostępu do ich codem –

+1

To jest zalecany i czystszy sposób przekazywania informacji, które masz w jednym działaniu do innych działań. Innym, bardziej hackowskim/niewłaściwym sposobem na to jest zachowanie danych jako pola statycznego w Działaniu i dostęp do niego z innych działań, ale jeśli ktoś zapyta, nie powiedziałem ci tego! :) –

2

To jest stare pytanie, ale na pewno odpowiem na to: -) Możesz rozszerzyć klasę aplikacji, aby zastosować rozwiązanie Abol3z do każdej aktywności. Utworzyć klasę:

public class MyApplication extends Application { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
     String lang = preferences.getString("lang", "en"); 
     Locale locale = new Locale(lang); 
     Locale.setDefault(locale); 
     Configuration config = new Configuration(); 
     config.locale = locale; 
     getBaseContext().getResources().updateConfiguration(config, 
       getBaseContext().getResources().getDisplayMetrics());  
    } 
} 

i ustawić MyApplication jako klasa aplikacji w manifeście:

<application 
     android:name=".MyApplication" 
     ... 
/> 

Można ustawić wartość Lang (w swoim turbinki):

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getContext()); 
preferences.edit().putString("lang", "en").commit(); 
+1

Zgodnie z [dokumentacją] (https://developer.android.com/reference/android/app/Application.html#onCreate()) aplikacja onCreate() jest wywoływana tylko przy uruchamianiu aplikacji . Tak naprawdę nie zmieniasz języka w środowisku wykonawczym, ale przy następnym uruchomieniu aplikacji, prawda? Edytuj: Ponownie przeczytaj oryginalne pytanie, na swój sposób rozwiązałeś problem. – Micha

1
btnChange.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(mContext); 
      //preferences.edit().putString("lang", "bn").commit(); 

      String lang = preferences.getString("lang", "en"); 
      //Log.e("lang", "lang in Main Activity:"+lang); 
      if (lang.equalsIgnoreCase("en")){ 
       setLocale("bn"); 
       preferences.edit().putString("lang", "bn").commit(); 
       btnChange.setText("Eng"); 
      }else if(lang.equalsIgnoreCase("bn")){ 
       setLocale("en"); 
       preferences.edit().putString("lang", "en").commit(); 
       btnChange.setText("বাংলা"); 
      } 
     } 
    }); 


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); 
    Intent refresh = new Intent(this, MainActivity.class); 
    startActivity(refresh); 
    finish(); 
} 

używamy dwa języki do celów testowych. zachowaj wszystkie ciągi w różnych folderach o nazwach wartości i wartościach-bn.

Powiązane problemy