2013-09-24 38 views
6

如何實現語言切換而無需在Android應用程序內手動設置區域設置?我知道應用程序會在啓動時根據區域設置加載strings.xml,但我不希望根據系統區域設置進行此選擇,而是要在「設置」中由用戶指定。在應用程序中切換語言android

或者,手動設置區域設置好嗎?

+0

你能更清楚的請的關鍵?您希望語言根據應用程序設置而不是設備區域設置進行更改? –

+0

是的,我希望應用程序語言根據應用程序設置進行更改。 –

回答

18

您可以擴展Application類(您也必須在清單中聲明它),並在其中放入類似的內容。

每當你想改變語言,您可以再調用

((App)getApplicationContext()).changeLang(lang); 

你的活動範圍內。 R.string.locale_lang只是存儲在爲strings.xml中共享偏好

public class App extends Application { 

    private Locale locale = null; 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     if (locale != null) { 
      Locale.setDefault(locale); 
      Configuration config = new Configuration(newConfig); 
      config.locale = locale; 
      getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 
     } 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); 
     String lang = settings.getString(getString(R.string.locale_lang), ""); 
     changeLang(lang); 
    } 

    public void changeLang(String lang) { 
     Configuration config = getBaseContext().getResources().getConfiguration(); 
     if (!"".equals(lang) && !config.locale.getLanguage().equals(lang)) { 

      Editor ed = PreferenceManager.getDefaultSharedPreferences(this).edit(); 
      ed.putString(getString(R.string.locale_lang), lang); 
      ed.commit(); 

      locale = new Locale(lang); 
      Locale.setDefault(locale); 
      Configuration conf = new Configuration(config); 
      conf.locale = locale; 
      getBaseContext().getResources().updateConfiguration(conf, getBaseContext().getResources().getDisplayMetrics()); 
     } 
    } 

    public String getLang(){ 
     return PreferenceManager.getDefaultSharedPreferences(this).getString(this.getString(R.string.locale_lang), ""); 
    } 



} 
+0

謝謝。我明白了。但是,我如何在清單中聲明它?不是我猜想的活動。 –

+1

不作爲一項活動,但您擁有包含活動標籤的應用程序標籤。作爲應用程序的屬性,您必須添加android:name =「。App」 – kjurkovic