Знак препинания, отображаемый в начале текста LTR в ОС RTL

Рассмотрим фрагмент:

<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)

0
0
234
1

Ответы 1

В "locale" нет ничего особенного, такое же отображение происходит, когда вы используете "rtl" для textDirection поля, которое имеет текст LTR, заканчивающийся на !. Или ., или любой другой знак препинания без сильной направленности.

Что можно сделать:

  1. заканчивайте эти тексты символом &lrm;:

    android:text = "Hello!\u200e"
    
  2. выберите "ltr" textDirection для этих полей.
  3. во время выполнения определите тестовые поля, которые начинаются с последовательности LTR или содержат только последовательность LTR (эта логика зависит от вашего выбора), и примените к этим полям правила 1. или 2. (см. выше).
  4. используйте вместо него 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"
    />
    

вариант 2 бесполезен, поскольку он заставляет текст выравниваться по левому краю (я хочу, чтобы выравнивание текста происходило из языкового стандарта). Кроме того, невозможно написать эту логику динамического разрешения для каждого текстового представления.

yash mittal 14.11.2018 21:59

Могу ли я вообще избежать использования textDirection? Моим мотивом использовать textDirection в качестве «языкового стандарта» было выравнивание текста в соответствии с языковым стандартом ОС (как LTR, так и RTL текст должен быть выровнен по правому краю в RTL).

yash mittal 14.11.2018 22:09

Вы можете установить выравнивание по правому краю, не выбирая textDirection: попробуйте android:textAlignment = "viewStart" для локали RTL.

Alex Cohn 14.11.2018 22:25

как я уже упоминал в описании вопроса, некоторые элементы textview могут иметь значение центра тяжести ... для них как LTR, так и RTL текст должны оставаться в центре. Указание textAlignment как viewStart переопределит это свойство gravity и выровняет текст по viewStart.

yash mittal 14.11.2018 22:29

Это не то, что я вижу. Может быть, это зависит от платформы, не могу сказать.

Alex Cohn 14.11.2018 22:48

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