Arhn - архитектура программирования

Как изменить язык в LocaleManager без повторного создания активности?

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

private void setNewLocale(AppCompatActivity mContext, @LocaleManager.LocaleDef String language) {
        LocaleManager.setNewLocale(this, language);
        Intent intent = mContext.getIntent();
        startActivity(intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK));
    }

Также я снова установил текст во все текстовое поле, но это не помогло!

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

При нажатии кнопки я устанавливаю локаль!

if(appPreference.getLanguage().equalsIgnoreCase("en")){
                    setNewLocale(MainActivity.this, LocaleManager.ARABIC);
                }
                else
                    setNewLocale(MainActivity.this, LocaleManager.ENGLISH);
26.02.2020

Ответы:


1

Вот подходящий способ изменения языкового стандарта приложения: Существуют некоторые трудности, которые необходимо преодолеть, чтобы программно изменить язык.

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

Решение:

public class LocaleHelper {

    private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";

    public static Context onAttach(Context context) {
        String lang = getPersistedData(context, Locale.getDefault().getLanguage());
        return setLocale(context, lang);
    }

    public static Context onAttach(Context context, String defaultLanguage) {
        String lang = getPersistedData(context, defaultLanguage);
        return setLocale(context, lang);
    }

    public static String getLanguage(Context context) {
        return getPersistedData(context, Locale.getDefault().getLanguage());
    }

    public static Context setLocale(Context context, String language) {
        persist(context, language);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            return updateResources(context, language);
        }

        return updateResourcesLegacy(context, language);
    }

    private static String getPersistedData(Context context, String defaultLanguage) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        return preferences.getString(SELECTED_LANGUAGE, defaultLanguage);
    }

    private static void persist(Context context, String language) {
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
        SharedPreferences.Editor editor = preferences.edit();

        editor.putString(SELECTED_LANGUAGE, language);
        editor.apply();
    }

    @TargetApi(Build.VERSION_CODES.N)
    private static Context updateResources(Context context, String language) {
        Locale locale = new Locale(language);
        Locale.setDefault(locale);

        Configuration configuration = context.getResources().getConfiguration();
        configuration.setLocale(locale);
        configuration.setLayoutDirection(locale);

        return context.createConfigurationContext(configuration);
    }

    @SuppressWarnings("deprecation")
    private static Context updateResourcesLegacy(Context context, String language) {
        Locale locale = new Locale(language);
        Locale.setDefault(locale);

        Resources resources = context.getResources();

        Configuration configuration = resources.getConfiguration();
        configuration.locale = locale;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
            configuration.setLayoutDirection(locale);
        }

        resources.updateConfiguration(configuration, resources.getDisplayMetrics());

        return context;
    }
}

Полное описание процесса: Ссылка

26.02.2020

2

Попробуйте приведенный ниже код, который обновит экран без перезапуска или повторного создания активности

private void setNewLocale(AppCompatActivity mContext, @LocaleManager.LocaleDef String language) {
    val newConfig = baseContext.resources.configuration
    newConfig.setLocale(Locale(language))
    onConfigurationChanged(newConfig)
}

override fun onConfigurationChanged(newConfig: Configuration) {
    updateLabels()
    super.onConfigurationChanged(newConfig)
}

private fun updateLabels() {
    //update all the views text here
    editTextMobileNumber.hint = getString(R.string.login_mobile_number_edit_text_hint)
}
26.02.2020
  • Вы передаете здесь правильную языковую строку ( newConfig.setLocale(Locale(language)) )? попробуйте en & gu вместо языка и убедитесь, что он должен работать следующим образом: newConfig.setLocale(Locale(gu)) 26.02.2020
  • да, я правильно передаю язык, но он не изменился, этот код работает только тогда, когда я воссоздаю действие !! 27.02.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..