2

我在我的應用程序中遇到了令人頭疼的語言環境。所以基本上我的應用程序支持兩種語言,英語和越南語,用戶可以選擇更改要顯示的語言。所以我有一個SettingActivity這樣的:Android - 應用程序語言環境更改和顯示的方向

public class SettingsActivity extends SherlockPreferenceActivity implements OnPreferenceChangeListener{ 
    private ListPreference langPref; 
    private SharedPreferences languagepref; 
    private String language; 
    private Locale locale; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    languagepref = PreferenceManager.getDefaultSharedPreferences(this);    
    Configuration config = getBaseContext().getResources().getConfiguration(); 
    language = languagepref.getString("languageToLoad","en"); 
    locale = new Locale(language); 
    Locale.setDefault(locale); 
    config.locale = locale; 
    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 

    addPreferencesFromResource(R.xml.preferences_login); 

    langPref = (ListPreference) findPreference("lang_pref"); 
    if (language.equalsIgnoreCase("vi")){ 
     langPref.setValueIndex(1); 
    } 
    else{ 
     langPref.setValueIndex(0); 
    } 
    langPref.setOnPreferenceChangeListener(this); 
} 


@Override 
public boolean onPreferenceChange(Preference preference, Object newValue) { 
    String key = preference.getKey(); 
    if (key.equals("lang_pref")){ 
     String languageToLoad = (String) newValue; 
     Locale locale = new Locale(languageToLoad); 
     Locale.setDefault(locale); 
     Configuration config = new Configuration(); 
     config.locale = locale; 
     getBaseContext().getResources().updateConfiguration(config, 
     getBaseContext().getResources().getDisplayMetrics()); 

     SharedPreferences.Editor editor = languagepref.edit(); 
     editor.putString("languageToLoad",languageToLoad); 
     editor.commit(); 
     recreate();  
    } 
    return false; 
} 
} 

在所有其他活動,我在他們的onCreate方法補充一點:

SharedPreferences languagepref = PreferenceManager.getDefaultSharedPreferences(this);    
     Configuration config = getBaseContext().getResources().getConfiguration(); 
     String language = languagepref.getString("languageToLoad","en"); 
     Locale locale = new Locale(language); 
     Locale.setDefault(locale); 
     config.locale = locale; 
     getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 

現在我的應用程序怪怪的:在SettingActivity,語言即使無需在活動的清單中添加android:configChanges="locale",也可以在我旋轉設備時正常顯示。但是,在其他任何活動中,旋轉設備時,語言會變回英語。我已嘗試在其清單中添加android:configChanges="locale",但它不起作用。此外,我已經嘗試了Stackoverflow上找到的每個解決方案,但它們都不適用於我,所以我現在基本上無能爲力。你們誰能幫我指出我在這裏犯的錯誤嗎?請提前做,謝謝。

+0

而不是使用getBaseContext(),嘗試使用getApplicationContext() – TacB0sS 2013-08-15 08:46:15

+0

我已經經歷了與本地化我頭痛:http://android-know-how-to.blogspot.co.il/2013/08 /multi-language-android-application.html – TacB0sS 2013-08-15 08:47:00

回答

0

嘗試增加

android:configChanges="orientation|keyboard|keyboardHidden" 
在清單

每個活動。

然後,您應該在您的活動中重寫onConfigurationChanged,並在此方法中重新加載佈局(取決於方向)。如果您仍然遇到區域設置問題,請在onConfigurationChanged中重新加載相應的區域設置。

+0

我很抱歉,具體說,'reload layout'是什麼意思? – 2013-04-30 10:53:32

+0

如果對橫向和縱向使用不同的xml佈局,當方向更改時,必須更改活動的佈局(例如,使用setContentView)。如果您使用山姆佈局,請忽略此,並專注於您的「地區」問題。 – Vincent 2013-04-30 11:35:11

相關問題