2013-11-03 50 views
0

我已經知道如何更改我的應用程序的語言(更新配置)。我的代碼還檢查配置是否被系統改變,並在'onCreate'方法中「修復」。我甚至創建了一個ListPreference來讓用戶用我的應用程序支持的語言來決定語言(並保存決定)。更改語言時修復資源

比方說,我有3個活動(A,B和SettingsActivity)。活動A可以啓動活動B和設置活動。活動B可以啓動SettingsActivity。如果用戶更改內部SettingsActivity的語言,我可以使用此代碼沒有任何問題更新其資源(在這種情況下字符串):

//if (Build.VERSION_CODES.HONEYCOMB <= Build.VERSION.SDK_INT) { 
// Disabled because it blinks and looks bad 
// recreate(); 
// } else { 
    startActivity(getIntent()); 
    finish(); 
    overridePendingTransition(0, 0); 
// } 

不過,我無法改變已經打開的活動,因爲我沒有從SettingsActivity引用它們。

我的問題:是否有任何干淨的方式來更新資源或重新創建已經開放的活動?如果我沒有找到一個更好的解決辦法,我的做法將是上述之一:

  1. 開始活動使用startActivityForResult並返回代碼觸發我已經使用重新創建活動的代碼。
  2. 檢查onResume方法的內部是否當前的語言已更改並執行相同的操作。
+0

[更改應用程序本身內的區域設置]的可能重複(http://stackoverflow.com/questions/2264874/changing-locale-within-the-app-itself)。爲了重新創建'Activity',我使用了'onResume()'方法。 –

+0

我已經閱讀過這個問題,大部分答案和我的問題都不是重複的。 – gian1200

+0

[這個答案](http://stackoverflow.com/a/4881721/2821954)是我在我的應用程序中使用的。基本上,對於每個可以訪問Activity的設置的Activity,都可以在'onCreate()'中添加一個變量來存儲當前的語言(比如'Locale'或'String'等等)。然後,覆蓋'onResume()'來檢查語言是否改變。如果是,請重新創建「活動」。 –

回答

0

在結束我所做的就是這樣的:

@Override 
protected void onStart() { 
    super.onStart(); 
    if (!locale.equals(getResources().getConfiguration().locale)) { 
     finish(); 
     startActivity(getIntent()); 
     overridePendingTransition(0, 0); 
     return; 
    } 
} 

locale是我onCreate方法分配一個變量:

private Locale locale; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    ((Application) getApplication()).refreshLanguage(); 
    locale = getResources().getConfiguration().locale; 
    setContentView(R.layout.activity_main); 
    //moar code 
} 

最後,張貼代碼的緣故,在這裏是我的refreshLanguage方法(S):

boolean refreshLanguage() { 
    return refreshLanguage(PreferenceManager.getDefaultSharedPreferences(this)); 
} 

boolean refreshLanguage(SharedPreferences sharedPreferences) { 
    if (sharedPreferences.contains("language")) { 
     int languageIndex = Integer.parseInt(sharedPreferences.getString("language", "0")); 
     if (!getResources().getConfiguration().locale.equals(languages[languageIndex])) { 
      Configuration config = new Configuration(); 
      config.locale = languages[languageIndex]; 
      getResources().updateConfiguration(config, null); 
      return true; 
     } 
    } 
    return false; 
} 

請注意,我使用onStart而不是onResume,因爲我沒有在透明活動或使用對話框之間切換。