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 для справа налево.