2011-10-17 60 views
6

在我的Android应用程序中,我有一个首选项活动,让用户重写应用程序的语言。要做到这一点我调用这个函数在每一个活动的的onResume(),然后重置内容视图:Android更新语言偏好活动

public static void checkOverrideSystemLanguage(Context context) { 
    SharedPreferences prefs = PreferenceManager 
      .getDefaultSharedPreferences(context); 

    // Check if system's language setting needs to be overridden 
    boolean overrideSystemLanguage = prefs.getBoolean(context 
      .getString(R.string.pref_key_chkbx_override_system_language), 
      false); 

    if (overrideSystemLanguage) { 

     // Get language selection and possible languages 
     String localeString = prefs.getString(
       context.getString(R.string.pref_key_list_languages), ""); 
     List<String> possibleLanguages = Arrays.asList(context 
       .getResources().getStringArray(
         R.array.pref_values_list_languages)); 

     if (possibleLanguages.contains(localeString)) { 

      // Change language setting in configuration 
      Locale locale = new Locale(localeString); 
      Locale.setDefault(locale); 
      Configuration config = new Configuration(); 
      config.locale = locale; 
      context.getResources().updateConfiguration(config, 
        context.getResources().getDisplayMetrics()); 
     } 
     // Use default language 
     else { 
      overrideSystemLanguage = false; 
     } 
    } 

    // Use default language 
    if (!overrideSystemLanguage) { 
     context.getResources().updateConfiguration(
       Resources.getSystem().getConfiguration(), 
       context.getResources().getDisplayMetrics()); 
    } 
} 

在每次工作完全正常活动。但是,在首选项活动中,当用户更改语言时,它不会立即更新,因为没有setContentView()方法。用户必须回到以前的活动并再次启动首选项活动才能看到反映的语言更改。

我想在一个onPreferenceChange()听者以下:

  1. 更新配置,删除和readding偏好:

    checkOverrideSystemLanguage(this);  
    // Remove all preferences and add them to update the language 
    getPreferenceScreen().removeAll(); 
    addPreferencesFromResource(R.xml.preferences); 
    
  2. 更新配置和调用的onCreate(空)

  3. 整理并重新开始活动

    finish(); 
    startActivity(new Intent(this, PreferencesActivity.class)); 
    

感谢您的帮助!

+0

您可以使用一些小技巧,并在开始调用的某种方法中调用getActionBar()。setTitle(“您的标题”) –

回答

1

我有一个类似的问题,我以这种方式解决(如你所说:完成和重新开始活动)。有用!

public class OptionsActivity extends PreferenceActivity implements YesNoDialogPreference.YesNoDialogListener, SharedPreferences.OnSharedPreferenceChangeListener { 

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

     //Options Setting 
     final SharedPreferences prefs = getSharedPreferences(OptionsUtility.PREFERENCE_NAME, MODE_PRIVATE); 
     String language = prefs.getString(OptionsUtility.PREFERENCE_LANGUAGE, OptionsUtility.DEFAULT_LANGUAGE); 

     //Update locale 
     OptionsUtility.updateLanguage(this, language); 
     prefs.registerOnSharedPreferenceChangeListener(this); 

     getPreferenceManager().setSharedPreferencesMode(MODE_PRIVATE); 
     getPreferenceManager().setSharedPreferencesName(OptionsUtility.PREFERENCE_NAME); 

     // Load the preferences from an XML resource 
     addPreferencesFromResource(R.xml.preferences); 

     Preference eraseGameButton = getPreferenceManager().findPreference(OptionsUtility.PREFERENCE_ERASE_GAME); 
     if (eraseGameButton != null) { 
      YesNoDialogPreference yesNo = (YesNoDialogPreference)eraseGameButton; 
      yesNo.setListener(this); 
     } 

     Preference configureKeyboardPref = getPreferenceManager().findPreference("keyconfig"); 
     if (configureKeyboardPref != null) { 
      //KeyboardConfigDialogPreference config = (KeyboardConfigDialogPreference)configureKeyboardPref; 
      //config.setPrefs(getSharedPreferences(MemodroidCoreActivity.PREFERENCE_NAME, MODE_PRIVATE)); 
      //config.setContext(this); 
     } 

    } 


    public void onDialogClosed(boolean positiveResult) { 
     if (positiveResult) { 
      DatabaseScoreManager dbsManager = new DatabaseScoreManager(getApplicationContext()); 
      dbsManager.resetHighScores(); 
      Toast.makeText(this, R.string.toast_highScoresReset,Toast.LENGTH_SHORT).show(); 
     } 
    } 


    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) { 
     restartActivity(); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); 
    } 

    private void restartActivity() { 
     Intent intent = getIntent(); 
     finish(); 
     startActivity(intent); 
    } 

    @Override 
    public void onBackPressed() { 
     finish(); 
    } 
}