Подтвердить что ты не робот

Android - Принудительная локализация reset при изменении ориентации

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

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

Вместо:

android:configChanges="locale"

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

android:configChanges="locale|orientation"

Ответ 4

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

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

    ...

}

Ответ 5

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