Как применять RTL динамично и эффективно - PullRequest
0 голосов
/ 25 октября 2018

Я создаю и добавляю TextViews в линейном макете динамически, всякий раз, когда я применяю layoutAmount.setRotationY(180);, макет меняет свое направление, которое является правильным, но слова TextViews внутри него также изменяют направление, которое является неправильным, например, еслислово извините, оно становится твоим, как я могу правильно применить RTL

Спасибо!

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

при выборе языка add;

LocaleHelper.setLocale(LAngSelect.this, "ar");

Затем сохраните его с помощью sqlite или др.

Затем перейдите к MainActivity с намерением:

на MainActivity получить языксохраните и добавьте:

if (langs.equals("ar")) {
                    forceRTLIfSupported();
                }

    private void forceRTLIfSupported()
    {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){

            //HERE CHECK CONDITION FOR YOUR LANGUAGE if it is AR then
            //change if it is english then don't

            getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);


        }
    }
0 голосов
/ 25 октября 2018

setLayoutDirection установит направление макета в соответствии с языком

-Убедитесь, что используйте начало и конец гравитации макета

 public static void setLanguage(Context context, String language) {
            String[] localeLang = language.split("_");
            Locale locale;
            if (localeLang.length > 1)
                locale = new Locale(localeLang[0], localeLang[1]);
            else
                locale = new Locale(localeLang[0]);
            Locale.setDefault(locale);
            Configuration config = new Configuration();
            config.locale = locale;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                config.setLayoutDirection(locale);
                ((Activity) context).getWindow().getDecorView().setLayoutDirection(config.getLayoutDirection());
            }
            context.getResources().updateConfiguration(config,
                    context.getResources().getDisplayMetrics());
        }
0 голосов
/ 25 октября 2018

Лучший способ сделать макет динамического RTL:

Если вы используете ConstraintLayout

Не используйте left and right

вместо этого, используйте start and end

Android будет динамически менять макет при изменении локали

Мой ответ здесь о том, как изменить язык приложения по локали

Обновление:

В ConstraintLayout Используйте ограничения как

    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toEndOf="@+id/imageView_about_back"
    app:layout_constraintTop_toTopOf="parent"

Также не используйте поля влево или вправо

В случае LinearLayout,

использование gravity start and end

пример кода:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background_image"
    tools:context=".activity.HomeActivity">
  <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="start"
    android:text="@string/about_al_ameen"
    android:textColor="@color/colorWhite" />
</LinearLayout>
...