2012-09-01 105 views
16

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

回答

31

你可以使用在转你想

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

+0

这会改变整个android系统中的lang还是只会改变应用程序?我这样问,以便当用户离开应用程序时,他们将能够继续使用android默认lang –

+0

@KarueBensonKarue,它将仅在应用程序中更改。 –

+0

很好,感谢您的回复 –

5

使用SharedPreferences跟踪用户选择的语言,然后将活动设置为在onCreate()和onResume()方法中使用该语言。通过这种方式,将整个应用程序重新启动等坚持

+1

做所有开发者在这里应用程序使用这种方式,我觉得它不是很清楚! –

+1

我无法为其他开发者说话,因为我无法访问他们的代码 –

+1

嗯,是的,这是将您在一项活动中的信息传递给其他活动的建议和更简洁的方法。另一种方法是将数据保存为活动中的静态字段,并从其他活动中访问它,但如果有人问起,我没有告诉你! :) –

2

这是一个古老的问题,但无论如何我都会回答: - ) 您可以扩展应用程序类以在每个活动上应用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" 
     ... 
/> 

您可以设置郎值(在你的微调):

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

根据[文档](https://developer.android.com/reference/android/app/Application.html#onCreate()),应用程序启动时仅调用Application onCreate() 。所以你不是真的在运行时改变语言,但是在下一个应用程序启动时,对吧?编辑:重新阅读原始问题,你的方式毕竟解决了问题。 – 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(); 
} 

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