Android: программно изменить все направления размещения приложений

Как мне изменить направление всего приложения на RTL? Я пишу приложение, что пользователь должен выбрать его язык при первом запуске, и макет должен измениться в зависимости от выбора пользователя в RTL или останется LTR. Раньше я добавлял android:supportsRtl="true" к AndroidManifest и android:layoutDirection="rtl" для каждого макета, но этот подход имеет некоторые проблемы, как показано ниже:

Одна из проблем заключается в изменении направления RTL в домашнем значке ActionBar или кнопке навигации (при включенном домашнем подключении) остается LRT и просто перемещается вправо.

Я также попытался изменить направление программно, и результат был таким же:

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
            getWindows().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
        }

введите описание изображения здесь

Есть ли способ заставить все действия сразу стать RTL или мы должны установить направление в каждом действии отдельно?

Ответы

Ответ 1

Вы можете использовать этот фрагмент кода, пока ваше приложение minSdk> = 17.

Я использовал fa для Farsi, вы можете использовать другой язык RTL.

Configuration configuration = getResources().getConfiguration();
configuration.setLayoutDirection(new Locale("fa"));
getResources().updateConfiguration(configuration, getResources().getDisplayMetrics());

Ответ 2

Изменить весь макет

 LinearLayout linrtl=(LinearLayout)findViewById(R.id.linrtl);
 linrtl.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);

Ответ 3

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

// set Persian language in the app
setLanguage(context, "fa");

public void setLanguage(Context c, String lang) {
    Locale localeNew = new Locale(lang);
    Locale.setDefault(localeNew);

    Resources res = c.getResources();
    Configuration newConfig = new Configuration(res.getConfiguration());
    newConfig.locale = localeNew;
    newConfig.setLayoutDirection(localeNew);
    res.updateConfiguration(newConfig, res.getDisplayMetrics());

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        newConfig.setLocale(localeNew);
        c.createConfigurationContext(newConfig);
    }
}

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

if (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) == ViewCompat.LAYOUT_DIRECTION_RTL) {
        view.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
} else {
        view.setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
}

Ответ 4

Кнопка "Назад" остается в режиме LTR, потому что у нее есть только один ресурс, который является стрелкой, указывающей влево. Вам нужно указать новую папку ресурсов, например drawable-ldrtl-hdpi, и поместить тот же значок, который указывает прямо в этой папке.

Ответ 5

У меня также есть эта проблема, я считаю, что если ваша ширина представления установлена ​​ MATCH_PARENT, вы должны установить силу тяжести вида с помощью Gravity.LEFT в модели LTR и установить силу тяжести вида с помощью Gravity.RIGHT в модели RTL.

Ответ 6

Следующий код будет работать:

    Resources your_resource = context.getResources();

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

где локаль является объектом локали