2011-10-17 16 views
6

W mojej aplikacji na Androida mam aktywność preferencji, która pozwala użytkownikowi zastąpić język aplikacji. Aby osiągnąć ten cel I wywołać tę funkcję w każdej działalności jest onResume(), a następnie przywrócić widok treści:Język aktualizacji Androida w działaniu preferencji

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

W każdej działalności to działa perfekcyjnie. Jednak w działaniu preferencji, gdy użytkownik zmienia język, nie jest od razu aktualizowany, ponieważ nie ma metody setContentView(). Użytkownik musi powrócić do poprzedniej aktywności i ponownie uruchomić aktywność preferencji, aby zobaczyć odzwierciedlenie zmiany języka.

Próbowałem następujących w onPreferenceChange() słuchacza:

  1. Aktualizowanie konfiguracji, usuwanie i readding preferencje:

    checkOverrideSystemLanguage(this);  
    // Remove all preferences and add them to update the language 
    getPreferenceScreen().removeAll(); 
    addPreferencesFromResource(R.xml.preferences); 
    
  2. Aktualizowanie konfiguracji i nazywając onCreate (null)

  3. Kończenie i wznawianie działania

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

Dzięki za pomoc!

+0

Możesz użyć małego hackowania i wywołania getActionBar() .setTitle ("Twój tytuł") w jakiejś metodzie, którą wywołujesz na początku –

Odpowiedz

1

Miałem podobny problem, rozwiązałem go w ten sposób (jak powiedziałeś: kończąc i wznawiając działalność). To działa!

Powiązane problemy