2010-02-24 5 views
16

Я пытаюсь заставить локаль в своем приложении указать пользователя. Поскольку это может быть использовано для демонстраций, я хочу изменить язык/локаль в приложении, а не в любое время для всего устройства.Android - принудительная перезагрузка локали при изменении ориентации

Я огляделся вокруг и попытался использовать каждый намек, который я нашел здесь. Результат: я могу перезапустить свою тестовую активность с новым языком, но если я изменил ориентацию, языковой стандарт будет всегда сбрасываться на устройство.

I uploaded a minimalistic project поэтому вы можете воспроизвести мою проблему. Пожалуйста, проигнорируйте сокращение пользовательского интерфейса, это не важно :)

ответ

2

Сбрасывается ли локаль, потому что ваша активность перезапускается при изменении ориентации?

Если да, то вы можете перехватывать или предотвратить ориентирование изменения: Activity restart on rotation Android

+0

I «перезапустить» свою активность с отделкой() и startActivity(), чтобы принудительно перезагрузить пользовательский интерфейс, который использует новую локаль.Изменение ориентации всегда сбрасывает мой язык – WarrenFaith

3

Я только что видел ваш код.

Проверьте, что вы используете Locale, из java.util, а не из android. Ваш код не изменит языковой стандарт мобильного телефона.

Чтобы проверить:

  • Я установил свой телефон на испанском языке.
  • Откройте приложение
  • нажмите кнопку
  • идти домой
  • иконы были на испанском, а не английский.

Если то, что вы пытаетесь сделать, это просто установка локали по умолчанию и быть в состоянии видеть то же значение, после поворота экрана:

Вместо:

android:configChanges="locale" 

использования:

android:configChanges="locale|orientation" 
9

Этот фрагмент кода делает то, что вам нужно, я его протестировал. Предположим, что для примера вы хотите, чтобы пользователь мог переключать язык через меню из вашего основного вида деятельности. Вы можете сделать это с помощью сохранения флага языка как предпочтения пользователя и проверить его на «OnCreate()» и «onConfigurationChanged()» следующим образом:

public class MainActivity extends Activity { 

SharedPreferences mPrefs1; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this); 
    String languageToLoad = mPrefs1.getString("languagePref", Locale.getDefault().getLanguage()); 
    Locale locale = new Locale(languageToLoad); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics()); 

    setContentView(R.layout.activity_main); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this); 
    String languageToLoad = mPrefs1.getString("languagePref", Locale.getDefault().getLanguage()); 
    Locale locale = new Locale(languageToLoad); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    getBaseContext().getResources().updateConfiguration(config,getBaseContext().getResources().getDisplayMetrics()); 
    setContentView(R.layout.activity_main); 
} 

// Declaring the Menu options 
@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{  
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.main_menu, menu); 
    return true; 
} 

//handle menu item selection 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    switch (item.getItemId()) { 
    case R.id.menu_switch_language: 
     String languageToLoad = getResources().getString(R.string.switch_language); 

     mPrefs1 = PreferenceManager.getDefaultSharedPreferences(this); 
     SharedPreferences.Editor editor = mPrefs1.edit(); 
     editor.putString("languagePref", languageToLoad); 
     editor.commit(); // Very important to save the preference      
     finish(); 
     startActivity(getIntent()); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

}

2

Вы должны заставить локаль в Применение :: onСоздание и Применение :: onConfigurationChanged. Не забудьте зарегистрировать свой класс Application в AndroidManifest.xml

3

Что работал для меня устанавливает локаль непосредственно перед раздувать макеты:

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

    String userLocale = "Wolof"; // adapt to your need 
    Locale locale = new Locale(userLocale); 
    Locale.setDefault(locale); 
    Configuration config = new Configuration(); 
    config.locale = locale; 
    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 

    setContentView(R.layout.my_activity); 

    ... 

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