2013-08-21 179 views
5

我希望我的語言能夠動態更改,我嘗試使用onConfigurationChanged,但它沒有被調用。我有一個MainActivity來創建我的操作欄和viewpager。我的其餘部分是碎片。在我的SettingsFragment中,我有一個按鈕來將語言切換到法語。區域設置:onConfigurationChanged不叫

langChange.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View vi) { 
      MainActivity main = (MainActivity)getActivity(); 
      main.langChange(); 
     } 

}); 

然後在我的MainActivity我有

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

public void langChange(){ 
    if(currentLanguage == FRENCH_LANGUAGE){ 
     locale = new Locale("en"); 
     Locale.setDefault(locale); 
     Configuration c = getBaseContext().getResources().getConfiguration(); 
     c.locale = locale; 
     getBaseContext().getResources().updateConfiguration(c,getBaseContext().getResources().getDisplayMetrics()); 
     currentLanguage = "English"; 
    } 
    else if(currentLanguage == ENGLISH_LANGUAGE){ 
     locale = new Locale("fr"); 
     Locale.setDefault(locale); 
     Configuration c = getBaseContext().getResources().getConfiguration(); 
     c.locale = locale; 
     getBaseContext().getResources().updateConfiguration(c,getBaseContext().getResources().getDisplayMetrics()); 
     currentLanguage = "French"; 
    } 
    actionBar.setSelectedNavigationItem(actionBar.getTabCount() - 1); //This just puts it back to the settings tab 
} 

onConfigurationChanged不會被調用。在我的表現,我有:

<activity android:name="MainActivity" android:screenOrientation="portrait" android:configChanges="locale"></activity> 

我已經嘗試添加沒有成功的一個或所有這些選項orientation|keyboardHidden|screenSize

所有這些的原因是因爲我想單擊按鈕時更改actionBar文本和所有其他文本。我有一個單獨的法語字符串文件。

任何幫助將是偉大的。

+0

你怎麼知道'onConfigurationChanged'沒有被調用?你在方法內部的代碼周圍檢查'null',這可能是問題所在。也看看這個問題:http://stackoverflow.com/questions/6457659/android-onconfigurationchanged-not-being-called – Darwind

+0

我添加了斷點之前和之後if語句與'Log.d'以及。我知道它沒有打這個方法。我也看了上面的問題,那些答案沒有解決我的問題 – BigT

回答

4

好的,我仔細研究了一下。

我不知道,爲什麼onConfigurationChanged方法沒有被調用,所以我希望有人能夠啓發我們這部分。

在我的搜索中,我偶然發現了這個tutorial,它實際上改變了Locale,通過改變配置。

您的代碼看起來很像這個教程其實;-)

不管怎麼說,關於教程和代碼,重要的是這種方法:

private void updateTexts() { 
    txt_hello.setText(R.string.hello_world); 
    btn_en.setText(R.string.btn_en); 
    btn_ru.setText(R.string.btn_ru); 
    btn_fr.setText(R.string.btn_fr); 
    btn_de.setText(R.string.btn_de); 
} 

這就是「神奇」發生;在您更改語言環境後,您需要重新加載資源,並且由於您告訴Android您想要自行處理某些配置,因此需要重新加載所有文本,方法是再次設置UI項目文本。

完成後,應用程序將加載特定區域設置文件夾中的字符串。

這個問題的答案,爲什麼Android的行爲這種方式,可以在official documentationActivity找到他說:

[...]

這樣做是因爲任何應用程序的資源,包括佈局文件,可以根據任何配置值進行更改。因此,處理配置更改的唯一安全方法是重新檢索所有資源,包括佈局,可繪製和字符串。因爲活動必須已經知道如何保存其狀態並從該狀態重新創建自己,所以這是通過新配置使活動自行重新啓動的便捷方式。

的傢伙寫的教程還跟整個教程項目添加爲下載,所以我建議你去看看,看看它是如何工作的,因爲它工作;-)您可以outcomment的onConfigurationChanged方法,因爲它似乎沒有做任何事情。

希望這會有所幫助。

+0

你是找到這個問題的上帝。這十分完美。我需要做的一些改變,以適應我的代碼,但完美的作品!謝謝 – BigT

+0

任何時候 - 我喜歡挖掘周圍;-) – Darwind

6

爲了調用onConfigurationChanged(),您必須定義android:configChanges =「layoutDirection | locale」。

+0

這實際上不起作用 –

+3

他是完全正確的,添加'layoutDirection'工作,沒有沒有。 – marco

+0

這也適用於我,你有什麼想法背後的背景是什麼? –