Android определить, если устройство находится на языке справа налево / макет

Есть ли способ определить, работает ли устройство на языке справа налево (что-то вроде арабского), а не на языке слева направо (на английском)?

Необходимо что-то совместимое со старыми уровнями API (до 10)

РЕШЕНИЕ

я закончил тем, что использовал метод xml в принятом ответе. Далее я также добавил указанный здесь код для случаев, когда у меня не было доступа к getResources().

Определение языка RTL в Android

больше информации

Этот вопрос все еще получает много трафика; Я хотел бы отметить кое-что еще: когда я первоначально спросил об этом, я думаю, что это было частично, чтобы помочь адресу, показывающему различные указывающие шевроны в RTL по сравнению с LTR - еще один изящный способ сделать это путем размещения в стандарте доступных для рисования ресурсов и ldrtl каталоги - означает, что код не требуется, чтобы определить, какой из них показать!

9 ответов

Решение

Вы можете создать папку values-ldrtl с помощью XML-файла с именем isrighttoleft.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="is_right_to_left">true</bool>
</resources>

и в вашей папке значений тот же файл с:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <bool name="is_right_to_left">false</bool>
</resources>

И, наконец, в коде:

boolean isRightToLeft = getResources().getBoolean(R.bool.is_right_to_left);

Значения-ldrtl будут использоваться только на устройстве, где определенные настройки (например, Язык) являются языками, читаемыми справа налево.

Я думаю, что это лучший способ:

val isLeftToRight = TextUtilsCompat.getLayoutDirectionFromLocale(Locale.getDefault()) == ViewCompat.LAYOUT_DIRECTION_LTR

Docs:

https://developer.android.com/reference/android/support/v4/text/TextUtilsCompat.html

Или, если у вас minAPI 17 или выше, вы можете просто использовать это:

val isLeftToRight=TextUtils.getLayoutDirectionFromLocale(Locale.getDefault())==View.LAYOUT_DIRECTION_LTR

Docs:

https://developer.android.com/reference/android/text/TextUtils.html

Gr, немного дольше гуглил, и я бы нашел это, прежде чем отправлять:

if (ViewCompat.getLayoutDirection(getView()) == ViewCompat.LAYOUT_DIRECTION_LTR) {
    // ...
}
else {
    // ...
}

http://developer.android.com/reference/android/support/v4/view/ViewCompat.html

Код Котлина для определения направления макета приложения:

 val config = resources.configuration
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        if (config.layoutDirection == View.LAYOUT_DIRECTION_LTR) {
           // showAlertMsg("LTR")
        } else {
           // showAlertMsg( "RTL")
        }
    }
    else {
        //TODO("VERSION.SDK_INT < JELLY_BEAN_MR1")
           }

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

вы можете использовать:

if (Locale.getDefault().layoutDirection == LayoutDirection.RTL)

Если это все еще получает значительный трафик, люди должны также рассмотреть Configuration.getLayoutDirection(), для API 17+. Он вернет либо LayoutDirection.LTR, либо LayoutDirection.RTL. Я предполагаю, что ViewCompat.getLayoutDirection (android.view.View) возвращает направление, которое фактически использовалось для разметки определенного вида. Если вы делаете что-то странное, например пытаетесь определить, какой человек должен находиться на какой-либо стороне экрана чата (например, я), это может пригодиться.

Это так просто. Просто используйте: isRtll()

      override fun isRtl(): Boolean {
    return super.isRtl()
}

Веселиться!

Если ваш Build.VERSION.SDK_INT больше чем JELLY_BEAN (16) вы можете использовать это:

val locale = Locale.getDefault() 
val isLtr = TextUtils.getLayoutDirectionFromLocale(locale) == ViewCompat.LAYOUT_DIRECTION_LTR

Да, используйте функцию Bidi.getBaseLevel(), она вернет 0 для слева направо и 1 для справа налево.

http://developer.android.com/reference/java/text/Bidi.html

Другие вопросы по тегам