2011-10-17 3 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() 메소드가 없기 때문에 언어를 즉시 업데이트하지 않는다. 사용자는 이전 활동으로 돌아가서 언어 활동이 다시 반영되도록 환경 설정 활동을 다시 시작해야합니다.

를 구성 업데이트

checkOverrideSystemLanguage(this);  
// Remove all preferences and add them to update the language 
getPreferenceScreen().removeAll(); 
addPreferencesFromResource(R.xml.preferences); 
  • 하고에서 onCreate (NULL)를 호출 : 분리 및 선호도를 재 부가, 구성 업데이트

    1. :

      난 ㄱ onPreferenceChange() 수신기의 다음 시도
    2. 활동 완료 및 다시 시작

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

    감사합니다.

  • +0

    작은 해킹을 사용하여 처음에 호출하는 일부 메소드에서 getActionBar(). setTitle ("your title")을 호출 할 수 있습니다. –

    답변

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