Проблемы с типом действия
У меня есть два языка в моем приложении. values /strings.xml и values-ru/strings.xml Когда я программно меняю язык, все строки переводятся, но название активности не изменяется. Я использую во всех действиях
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
String languageToLoad = prefs.getString("prefLanguage","en");
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());
Когда я выбираю язык, активность или приложение перезагружаются.
Ответы
Ответ 1
Я использовал другой способ, который кажется глупым, но он работает
в каждом действии попытайтесь установить заголовок панели действий в свой заголовок активности из файла значений
в моем случае я использовал sherlockactionbar
поэтому я добавил это в oncreate
моей активности productdetails
getSupportActionBar().setTitle(getResources().getString(R.string.title_activity_product_details));
Ответ 2
Наконец-то получилось решение:
Получите resouce Id
заголовка действия из PackageManger
и установите заголовок AcionBar
на идентификатор ресурса, на этот раз, поскольку локаль уже изменена. android знает, какой тип заголовка выбрать.
try{
ActivityInfo activityInfo = getPackageManager().getActivityInfo(getComponentName(),
PackageManager.GET_META_DATA);
ActionBar actionBar = getActionBar();
if(actionBar != null)
actionBar.setTitle(activityInfo.labelRes);
}catch (PackageManager.NameNotFoundException ex){
Log.e(this.getClass().getSimpleName(),
"Error while getting activity info. " + ex.getMessage(), ex);
}
Ответ 3
Добавление setTitle(R.string.activity_title)
в onCreate()
обновляет заголовок Activity, а также сам контент об изменениях в локали в Runtime.
Ниже приведен простой фрагмент, который обновляет свой контент и название активности в Корее (ko-KR) при нажатии кнопки:
public class MainActivity extends AppCompatActivity {
Button btnReset;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Activity title will be updated after the locale has changed in Runtime
setTitle(R.string.app_name);
btnReset = (Button) findViewById(R.id.button);
btnReset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Resources resources = getResources();
DisplayMetrics dm = resources.getDisplayMetrics();
Configuration conf = resources.getConfiguration();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
conf.setLocale(Locale.KOREA);
} else {
conf.locale = Locale.KOREA;
}
resources.updateConfiguration(conf, dm);
// Overwrite the default Locale
Locale.setDefault(Locale.KOREA);
// Clear the back stack then restarts the activity
startActivity(new Intent(MainActivity.this, MainActivity.class)
.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| IntentCompat.FLAG_ACTIVITY_CLEAR_TASK));
}
});
}
}
Ответ 4
Я сделал это следующим образом и работал у меня.
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle(resources.getString(R.string.app_name));
setSupportActionBar(toolbar);
Используйте этот код после изменения локальной конфигурации.