2011-10-17 14 views
6

En mi aplicación de Android tengo una actividad de preferencia que permite al usuario anular el idioma de la aplicación. Para lograr esto que llamo esta función en onResume de cada actividad() y luego se restablece la vista de contenido:Idioma de actualización de Android en la actividad de preferencia

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()); 
    } 
} 

En toda actividad funciona perfectamente bien. En la actividad de preferencia, sin embargo, cuando el usuario cambia el idioma, no se actualiza de inmediato, porque no hay un método setContentView(). El usuario debe volver a la actividad anterior y comenzar de nuevo la actividad de preferencias para ver reflejado el cambio de idioma.

Probé la siguiente en un onPreferenceChange() oyente:

  1. Actualización de la configuración, la eliminación y readding las preferencias:

    checkOverrideSystemLanguage(this);  
    // Remove all preferences and add them to update the language 
    getPreferenceScreen().removeAll(); 
    addPreferencesFromResource(R.xml.preferences); 
    
  2. Actualización de la configuración y llamando onCreate (null)

  3. Finalizando y reiniciando la actividad

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

Gracias por su ayuda!

+0

Puede usar un pequeño truco y llamar a getActionBar(). SetTitle ("su título") en algún método que llame al principio –

Respuesta

1

Tuve un problema similar, lo resolví de esta manera (como dijiste: terminar y reiniciar la actividad). ¡Funciona!

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(); 
    } 
} 
Cuestiones relacionadas