Android如何在运行时更改应用程序语言

问题描述 投票:18回答:4

我想让用户使用微调器(或任何方式)更改我的应用程序的语言。我尝试了很多方法,但他们改变了这个活动的语言而不是所有的活动,我想保存它,所以当用户重启应用程序时,他会找到最后选择的语言。

android runtime
4个回答
38
投票

您可以在微调器中以任何方式使用此代码

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());

那么你应该保存这样的语言

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

并在onCreate()的每个活动中使用相同的代码从SharedPreferences加载languageToLoad


5
投票

使用SharedPreferences跟踪用户选择的语言,然后在onCreate()和onResume()方法中设置要使用该语言的活动。这样它会在应用程序重启等过程中持续存在。


2
投票

这是一个老问题,但无论如何我都会回答:-)你可以扩展Application类,在每个Activity上应用Abol3z的解决方案。创建类:

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());    
   }  
}

并在清单中将MyApplication设置为应用程序类:

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

您可以设置lang值(在您的微调器中):

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

2
投票
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();
}

我们使用两种语言进行测试。将所有字符串保存在不同的文件夹命名值和值-bn中。

© www.soinside.com 2019 - 2024. All rights reserved.