Изменить android Язык только для текущей активности - PullRequest
0 голосов
/ 10 января 2020

Есть ли способ изменить Locale в Android приложении только для текущего Activity?

У меня есть form в Activity, и я хотел бы добавить опцию для Пользователь выбирает, на каком языке он хочет заполнить форму. Так что будет возможность выбрать язык внутри того же упражнения.

Эта опция должна быть доступна в любое время, и при выборе нового языка информация формы должна сохраняться. Чтобы это можно было сделать во время заполнения формы.

    Locale locale = new Locale("fi");
    Locale.setDefault(locale);
    Configuration config = context.getResources().getConfiguration();
    config.locale = locale;
    context.getResources().updateConfiguration(config,
            context.getResources().getDisplayMetrics());

Я наткнулся на это решение, которое изменяет весь язык приложения, но не изменяется в пределах текущего Activity, пока вы не перезагрузите его. И при перезагрузке действия, form data теряется.

Полагаю, я мог бы сохранить информацию о форме внутри Bundle, а затем перезагрузить ее, когда будет выбран новый язык, но есть ли лучший способ сделать это?

EDIT

Я отображаю form в Controller, поэтому изменяю Locale, а затем recreating действие на самом деле не вариант, так как экран будет пустым в течение 1-2 секунд. ,

Есть ли лучший способ сделать это? Может быть, есть способ перезагрузить только текстовые поля?

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

@OnClick(R.id.btnLocaleEng)
public void onLocaleChangedEng(){
    Locale english = new Locale("en", "US");
    Resources resources = getLocalizedResources(context, english);
    title.setText(resources.getString(R.string.title));
    ...
}

@OnClick(R.id.btnLocaleFi)
public void onLocaleChangedFi(){
    Locale english = new Locale("fi", "FI");
    Resources resources = getLocalizedResources(context, english);
    title.setText(resources.getString(R.string.title));
    ...
}

@NonNull
public Resources getLocalizedResources(Context context, Locale desiredLocale) {
    Configuration conf = context.getResources().getConfiguration();
    conf = new Configuration(conf);
    conf.setLocale(desiredLocale);
    Context localizedContext = context.createConfigurationContext(conf);
    return localizedContext.getResources();
}

По сути дела, и так как у меня есть еще 30 полей, мне нужно будет сделать их все по одному. Трудно поверить, что другого выхода нет.

...