Рассмотрим фрагмент:
<TextView
android:layout_width = "wrap_content"
android:layout_width = "wrap_content"
android:text = "Hello!"
android:textDirection = "locale"/>
Код приводит к отображению «! Hello» вместо ожидаемого «Hello!». когда язык ОС установлен на RTL. Это наблюдается только с textDirection, установленным на "locale", в противном случае текст отображается правильно.
Мне нужно установить TextDirection в качестве языкового стандарта, чтобы текст был выровнен в текстовом представлении в соответствии с языковым стандартом ОС. Есть ли способ использовать textdirection в качестве языкового стандарта без нарушения рендеринга текста или любого другого простого решения для достижения того же эффекта.
PS: Я хочу применить это на глобальном уровне ко всем текстовым представлениям и, следовательно, не могу использовать textAlignment (как viewStart), так как это испортит свойство гравитации, установленное для представлений. (в частности, Gravity, установленный как центральный горизонтальный, будет проигнорирован в пользу textalignment = viewStart)
В "locale" нет ничего особенного, такое же отображение происходит, когда вы используете "rtl" для textDirection поля, которое имеет текст LTR, заканчивающийся на !. Или ., или любой другой знак препинания без сильной направленности.
Что можно сделать:
заканчивайте эти тексты символом ‎:
android:text = "Hello!\u200e"
"ltr" textDirection для этих полей.используйте вместо него android:textAlignment = "viewStart":
<FrameLayout
android:layoutDirection = "rtl" ...>
<TextView
android:text = "Hello!"
android:textAlignment = "viewStart"
android:layout_width = "80dp"
android:padding = "12dp"
android:background = "@android:color/black"
android:textColor = "@android:color/white"
android:layout_height = "wrap_content"
android:layout_gravity = "center_horizontal"
/>
Могу ли я вообще избежать использования textDirection? Моим мотивом использовать textDirection в качестве «языкового стандарта» было выравнивание текста в соответствии с языковым стандартом ОС (как LTR, так и RTL текст должен быть выровнен по правому краю в RTL).
Вы можете установить выравнивание по правому краю, не выбирая textDirection: попробуйте android:textAlignment = "viewStart" для локали RTL.
как я уже упоминал в описании вопроса, некоторые элементы textview могут иметь значение центра тяжести ... для них как LTR, так и RTL текст должны оставаться в центре. Указание textAlignment как viewStart переопределит это свойство gravity и выровняет текст по viewStart.
Это не то, что я вижу. Может быть, это зависит от платформы, не могу сказать.
вариант 2 бесполезен, поскольку он заставляет текст выравниваться по левому краю (я хочу, чтобы выравнивание текста происходило из языкового стандарта). Кроме того, невозможно написать эту логику динамического разрешения для каждого текстового представления.