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

Проблемы с типом действия

У меня есть два языка в моем приложении. 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());

Когда я выбираю язык, активность или приложение перезагружаются.

4b9b3361

Ответ 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);

Используйте этот код после изменения локальной конфигурации.