Ответ 1
Является ли reset локали, потому что ваша активность перезапускается при изменении ориентации?
Если это так, вы можете перехватить или предотвратить изменения ориентации: Перезагрузка активности при ротации Android
Я пытаюсь заставить локаль в моем приложении указать один пользователь. Поскольку это может быть использовано для демонстраций, я хочу изменить язык/локаль в приложении, а не в любое время для всего устройства.
Я огляделся вокруг и попытался использовать каждый намек, который я нашел здесь. Результат: я могу перезапустить свою тестовую активность с новым языком, но если я изменил ориентацию, языковой стандарт всегда будет сброшен на устройство.
I загрузил минималистический проект, чтобы вы могли воспроизвести мою проблему. Пожалуйста, проигнорируйте сокращение пользовательского интерфейса, это не важно:)
Является ли reset локали, потому что ваша активность перезапускается при изменении ориентации?
Если это так, вы можете перехватить или предотвратить изменения ориентации: Перезагрузка активности при ротации Android
Этот фрагмент кода делает то, что вам нужно, я его протестировал. Предположим, что для примера вы хотите, чтобы пользователь мог переключать язык через меню из вашего основного вида деятельности. Вы можете сделать это, сохранив флаг языка в качестве пользовательского предпочтения и проверив его на "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);
}
}
}
Я только что видел ваш код.
Убедитесь, что Locale
, который вы используете, - от java.util, а не от android. Ваш код не изменит локаль мобильного телефона.
Чтобы проверить это:
Если то, что вы пытаетесь сделать, это просто установить для Locale значение по умолчанию и иметь возможность видеть одно и то же значение после вращения экрана:
Вместо:
android:configChanges="locale"
использование:
android:configChanges="locale|orientation"
Что сработало для меня - это установить язык перед тем, как раздувать макеты:
@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);
...
}
Вы должны принудительно настроить свой язык в приложении:: onCreate и приложении:: onConfigurationChanged. Не забудьте зарегистрировать свой класс приложения в AndroidManifest.xml