2010-02-24 88 views
16

我嘗試強制將我的應用中的語言環境強制爲用戶指定的一種。由於這可能用於演示,我想更改應用程序中的語言/區域設置,而不是整個設備的任何時間。Android - 針對方向更改強制的語言環境重置

我環顧了一下,試圖用我在這裏找到的每一個提示。結果是:我可以用新語言重新開始測試活動,但如果更改方向,語言環境將始終重置爲設備一。

I uploaded a minimalistic project所以你可以重現我的問題。請忽略UI的縮小,這不重要:)

回答

2

由於您的活動在方向更改時重新啓動,是否重置了語言環境?

如果是這樣,你可以攔截或防止方向改變Activity restart on rotation Android

+0

我「重新啓動」我與完成活動()和startActivity()強制重載使用新語言環境的用戶界面。方向更改總是重置我的語言環境 – WarrenFaith 2010-02-24 08:09:01

3

我剛纔看到你的代碼。

檢查您使用的Locale來自java.util,而不是來自android。您的代碼不會更改手機的區域設置。

爲了測試它:

  • 我把我的電話給西班牙。
  • 打開應用
  • 點擊按鈕
  • 去家裏
  • 圖標是在西班牙,而不是英語。

如果你正在嘗試做的Locale只是設置爲默認,並能夠看到屏幕旋轉後相同的值是什麼:

相反的:

android:configChanges="locale" 

使用:

android:configChanges="locale|orientation" 
9

此代碼片段可以滿足您的需求,我測試過它。假設您希望用戶能夠通過主要活動的菜單切換語言。你可以做到這一點通過保存語言標誌作爲用戶偏好,並檢查它的「的onCreate()」和「onConfigurationChanged()」,如下所示:

public class MainActivity extends Activity { 

SharedPreferences mPrefs1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this); 
    String languageToLoad = mPrefs1.getString("languagePref", Locale.getDefault().getLanguage()); 
    Locale locale = new Locale(languageToLoad); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics()); 

    setContentView(R.layout.activity_main); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this); 
    String languageToLoad = mPrefs1.getString("languagePref", Locale.getDefault().getLanguage()); 
    Locale locale = new Locale(languageToLoad); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics()); 
    setContentView(R.layout.activity_main); 
} 

// Declaring the Menu options 
@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{  
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main_menu, menu); 
    return true; 
} 

//handle menu item selection 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    switch (item.getItemId()) { 
    case R.id.menu_switch_language: 
     String languageToLoad = getResources().getString(R.string.switch_language); 

     mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this); 
     SharedPreferences.Editor editor = mPrefs1.edit(); 
     editor.putString("languagePref", languageToLoad); 
     editor.commit(); // Very important to save the preference      
     finish(); 
     startActivity(getIntent()); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

}

2

你應該強迫你的語言環境應用:: onCreate應用:: onConfigurationChanged。 不要忘記註冊您的應用程序類AndroidManifest.xml中

3

什麼工作對我來說是設置語言環境中虛增您的佈局權之前:

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

    String userLocale = "Wolof"; // adapt to your need 
    Locale locale = new Locale(userLocale); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 

    setContentView(R.layout.my_activity); 

    ... 

}