2011-10-17 16 views
6

Nella mia app Android ho un'attività di preferenza che consente all'utente di ignorare la lingua dell'app. Per raggiungere questo io chiamo questa funzione in onResume di ogni attività() e poi ripristinare la visualizzazione di contenuti:Lingua di aggiornamento Android nell'attività preferita

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

In ogni attività che funziona perfettamente bene. Nell'attività di preferenza, tuttavia, quando l'utente cambia lingua, non viene aggiornato immediatamente, perché non esiste un metodo setContentView(). L'utente deve tornare all'attività precedente e riavviare l'attività di preferenze per vedere la modifica della lingua riflessa.

ho provato quanto segue in un'onPreferenceChange() ascoltatore:

  1. Aggiornamento della configurazione, rimozione e readding preferenze:

    checkOverrideSystemLanguage(this);  
    // Remove all preferences and add them to update the language 
    getPreferenceScreen().removeAll(); 
    addPreferencesFromResource(R.xml.preferences); 
    
  2. Aggiornamento della configurazione e chiamando onCreate (Null)

  3. Rifinitura e riavvio dell'attività

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

Grazie per il vostro aiuto!

+0

È possibile utilizzare un piccolo trucco e chiamare getActionBar(). SetTitle ("il titolo") in un metodo che si chiama all'inizio –

risposta

1

Ho avuto un problema simile, ho risolto in questo modo (come hai detto: terminare e riavviare l'attività). Funziona!

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