2

У меня болит голова в локальном приложении. Таким образом, в основном мое приложение поддерживает два языка, английский и вьетнамский, и пользователь может выбрать способ изменения отображаемого языка. Так что у меня SettingActivity так:Android - изменение локалей и отображаемая ориентация приложения

public class SettingsActivity extends SherlockPreferenceActivity implements OnPreferenceChangeListener{ 
    private ListPreference langPref; 
    private SharedPreferences languagepref; 
    private String language; 
    private Locale locale; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    languagepref = PreferenceManager.getDefaultSharedPreferences(this);    
    Configuration config = getBaseContext().getResources().getConfiguration(); 
    language = languagepref.getString("languageToLoad","en"); 
    locale = new Locale(language); 
    Locale.setDefault(locale); 
    config.locale = locale; 
    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 

    addPreferencesFromResource(R.xml.preferences_login); 

    langPref = (ListPreference) findPreference("lang_pref"); 
    if (language.equalsIgnoreCase("vi")){ 
     langPref.setValueIndex(1); 
    } 
    else{ 
     langPref.setValueIndex(0); 
    } 
    langPref.setOnPreferenceChangeListener(this); 
} 


@Override 
public boolean onPreferenceChange(Preference preference, Object newValue) { 
    String key = preference.getKey(); 
    if (key.equals("lang_pref")){ 
     String languageToLoad = (String) newValue; 
     Locale locale = new Locale(languageToLoad); 
     Locale.setDefault(locale); 
     Configuration config = new Configuration(); 
     config.locale = locale; 
     getBaseContext().getResources().updateConfiguration(config, 
     getBaseContext().getResources().getDisplayMetrics()); 

     SharedPreferences.Editor editor = languagepref.edit(); 
     editor.putString("languageToLoad",languageToLoad); 
     editor.commit(); 
     recreate();  
    } 
    return false; 
} 
} 

В любой другой деятельности, я добавляю это в их методе onCreate:

SharedPreferences languagepref = PreferenceManager.getDefaultSharedPreferences(this);    
     Configuration config = getBaseContext().getResources().getConfiguration(); 
     String language = languagepref.getString("languageToLoad","en"); 
     Locale locale = new Locale(language); 
     Locale.setDefault(locale); 
     config.locale = locale; 
     getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 

А теперь мое приложение действует странно: в SettingActivity, язык отображается правильно всякий раз, когда я поворачиваю свое устройство, даже без необходимости добавления android:configChanges="locale" в манифест активности. Однако при каждом другом действии, когда я поворачиваю устройство, язык изменяется на английский. Я попытался добавить android:configChanges="locale" в свой манифест, но он не работает. Кроме того, я пробовал все решения, найденные в Stackoverflow, но ни один из них не работает для меня, поэтому я в принципе не знаю. Может ли кто-нибудь из вас помочь мне указать на ошибку, которую я здесь сделал? Прошу вас и спасибо заранее.

+0

вместо использования getBaseContext(), попробуйте использовать getApplicationContext() – TacB0sS

+0

Я сам столкнулся с головной болью с локализацией: http://android-know-how-to.blogspot.co.il/2013/08 /multi-language-android-application.html – TacB0sS

ответ

0

Попробуйте добавить

android:configChanges="orientation|keyboard|keyboardHidden" 

в манифесте для каждого вида деятельности.

Затем вы должны переопределить onConfigurationChanged в своих действиях и в этом методе перезагрузить макет (в зависимости от ориентации). Если у вас все еще есть проблемы с локалью, перезагрузите соответствующий языковой стандарт в onConfigurationChanged.

+0

Прошу прощения, но что вы подразумеваете под «reload layout»? –

+0

, если вы используете другой макет xml для пейзажа и портрета, при изменении ориентации вы должны изменить макет для своей деятельности (например, с помощью setContentView). Если вы используете макет sam, просто проигнорируйте это и сосредоточьтесь на своей проблеме «locale». – Vincent

Смежные вопросы