Изменение языка не работает после перехода на Androidx - PullRequest
6 голосов
/ 20 марта 2019

У меня есть старый проект, который поддерживает несколько языков. Я хочу обновить библиотеку поддержки и целевую платформу, До перехода на Androidx все работало нормально, но теперь смена языка не работает!

Я использую этот код для изменения локали приложения по умолчанию

private static Context updateResources(Context context, String language)
{
    Locale locale = new Locale(language);
    Locale.setDefault(locale);

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

    return context.createConfigurationContext(configuration);
}

И вызывать этот метод для каждого действия путем переопределения attachBaseContext следующим образом:

@Override
protected void attachBaseContext(Context newBase)
{
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
    String language = preferences.getString(SELECTED_LANGUAGE, "fa");
    super.attachBaseContext(updateResources(newBase, language));
}

Я пытаюсь использовать другой метод, чтобы получить строку, и заметил, что 101 getActivity().getBaseContext().getString работает, а getActivity().getString не работает. Даже следующий код не работает и всегда показывает app_name vlaue в ресурсе по умолчанию string.xml.

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/app_name"/>

Я поделился примером кода в https://github.com/Freydoonk/LanguageTest

Также getActivity()..getResources().getIdentifier не работает и всегда возвращает 0!

Ответы [ 4 ]

5 голосов
/ 24 марта 2019

Наконец я нахожу проблему в своем приложении.При переносе проекта на Androidx зависимости моего проекта менялись следующим образом:

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'androidx.appcompat:appcompat:1.1.0-alpha03'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'com.google.android.material:material:1.1.0-alpha04'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-alpha02'
} 

Как видно, версия androidx.appcompat:appcompat равна 1.1.0-alpha03, когда я изменил ее на последнюю стабильную версию, 1.0.2, моя проблема решена и язык изменения работает правильно.

Я нахожу последнюю стабильную версию библиотеки appcompat в Репозиторий Maven .Я также изменяю другие библиотеки на последнюю стабильную версию.

Теперь мой раздел зависимостей приложения выглядит следующим образом:

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'com.google.android.material:material:1.0.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}
0 голосов
/ 15 июля 2019

Наконец-то я получил решение для locate, в моем случае проблема была на самом деле с bundle apk, потому что он разделил файлы locate.В bundle apk по умолчанию будут созданы все сплиты.но в блоке Android вашего build.gradle файла вы можете указать, какие разделы будут сгенерированы.

bundle {
            language {
                // Specifies that the app bundle should not support
                // configuration APKs for language resources. These
                // resources are instead packaged with each base and
                // dynamic feature APK.
                enableSplit = false
            }
        }

После добавления этого кода в блок Android build.gradle файла myпроблема решена.

0 голосов
/ 04 апреля 2019

Теперь есть более новая версия, которая также работает:

implementation 'androidx.appcompat:appcompat:1.1.0-alpha04'

Как упомянул @Fred *, у 1004 * есть сбой, хотя он не упоминается в журнале релизных версий

0 голосов
/ 20 марта 2019

1.Метод, который вы можете использовать в attachBaseContext ()

private void setLanguage(Context mContext, String localeName) {
        Locale myLocale = new Locale(localeName);
        Resources res = mContext.getResources();
        DisplayMetrics dm = res.getDisplayMetrics();
        Configuration conf = res.getConfiguration();
        conf.locale = myLocale;
        res.updateConfiguration(conf, dm);
    }

2.Переопределение в действиях

@Override
protected void attachBaseContext(Context newBase) {
    setLanguage(newBase, "your language");
    super.attachBaseContext(newBase);
}

Примечание: Это работает нормально для меня после того, как я воссоздаю упражнение

...