2015-07-16 6 views
1

Я пытаюсь предоставить языковые настройки (английский, традиционный китайский и упрощенный китайский) в приложении для Android, но при изменении языкового предпочтения приложение не имеет каких-либо изменений, оно все еще показывает такой же язык. Я упомянул аналогичные вопросы в stackoverflow, но я до сих пор не знаю, где моя проблема. Я хотел бы найти некоторые подсказки для обнаружения ошибок. Большое вам спасибо за вашу помощь!Изменение настроек языка приложения с использованием PreferenceFragment

public class AppPrefActivity extends Activity { 

private SharedPreferences.OnSharedPreferenceChangeListener prefListener; 
SharedPreferences pref; 

public static final String PREF_LANGUAGE = "language_pref"; 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    getFragmentManager().beginTransaction().replace(android.R.id.content, new PrefsFragement()).commit(); 

} 

public static class PrefsFragement extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     addPreferencesFromResource(R.xml.preference); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); 
    } 

    @Override 
    public void onPause() { 
     getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); 
     super.onPause(); 
    } 

    @Override 
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { 
     if(key.equals(PREF_LANGUAGE)) 
     { 
      Preference connectionPref = findPreference(key); 
      connectionPref.setSummary(sharedPreferences.getString(key, "")); 
      changeLanguagePref(sharedPreferences.getString(key, "")); 
     } 
    } 

      private void changeLanguagePref(Context context, String lang){ 
     Locale locale = null; 
     if (lang.equals("Traditional Chinese")){ 
      locale = new Locale("zh");//("zh_rTW"); 
     }else if (lang.equals("Simplified Chinese")){ 
      locale = new Locale("zh");//("zh_rCN"); 
     }else{ 
      locale = new Locale("en"); 
     } 
     Locale.setDefault(locale); 
     Configuration config = new Configuration(); 
     config.locale = locale; 
     context.getResources().updateConfiguration(config, null); 
    } 

} 

}

AndroidManifest.xml настройки массива

   <activity 
     android:name=".AppPrefActivity" 
     android:label="AppPrefActivity" 
     android:configChanges="locale"> 
     <intent-filter> 
      <action android:name="com.proj.george.betslog.AppPrefActivity" /> 

      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 

Привилегированные

<string-array name="app_language"> 
    <item>Traditional Chinese</item> 
    <item>Simplified Chinese</item> 
    <item>English</item> 
</string-array> 
+0

Краткое примечание: Я думаю, вам необходимо перезагрузить фрагмент (или перейти на другой фрагмент/действие), чтобы просмотреть изменения. Если я правильно помню, он не изменится автоматически. –

+0

Вы имеете в виду добавление «getPreferenceScreen(). GetSharedPreferences(). RegisterOnSharedPreferenceChangeListener (this);" в методе onCreate? – George

ответ

1

Вам нужно сделать 2 вещи:

  1. Добавьте следующее в манифесте:

    андроида: configChanges = "локаль"

  2. Создать один метод в экране настроек, где изменить язык пользователя:

    public static void updateLanguage(Context context, String selectedLanguage) { 
        if (!"".equals(selectedLanguage)) { 
         if ("English".equals(selectedLanguage)) { 
          selectedLanguage = "en"; 
         } else if ("Traditional Chinese".equals(selectedLanguage)) { 
          selectedLanguage = "zh"; 
         } 
         Locale locale = new Locale(selectedLanguage); 
         Locale.setDefault(locale); 
         Configuration config = new Configuration(); 
         config.locale = locale; 
         context.getResources().updateConfiguration(config, null); 
        } 
    } 
    
+0

Я изменил имя папки из value-zh-rCN на value-zh, чтобы проверить код. Но после изменения настройки он по-прежнему не может изменить язык. – George