Android - принудительный сброс локали при изменении ориентации - PullRequest
17 голосов
/ 24 февраля 2010

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

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

Я загрузил минималистичный проект , чтобы вы могли воспроизвести мою проблему. Пожалуйста, не обращайте внимания на сокращение пользовательского интерфейса, это не важно:)

Ответы [ 5 ]

9 голосов
/ 30 января 2013

Этот фрагмент кода делает то, что вам нужно, я проверял это. Предположим, в качестве примера вы хотите, чтобы пользователь мог переключать язык с помощью меню из вашего основного занятия. Это можно сделать, сохранив языковой флаг в качестве предпочтения пользователя и отметив его в 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);
  }
}   

}

3 голосов
/ 14 июля 2015

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

@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);

    ...

}
3 голосов
/ 24 февраля 2010

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

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

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

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

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

Вместо:

android:configChanges="locale"

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

android:configChanges="locale|orientation"
2 голосов
/ 15 января 2015

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

2 голосов
/ 24 февраля 2010

Произошел ли сброс языкового стандарта из-за перезапуска вашей активности при изменении ориентации?

Если это так, вы можете перехватить или предотвратить изменение ориентации : Перезапуск активности при вращении Android

...