TextView 提示弄乱了 RTL 重力

Posted

技术标签:

【中文标题】TextView 提示弄乱了 RTL 重力【英文标题】:TextView Hint messes up RTL gravity 【发布时间】:2018-11-17 00:17:31 【问题描述】:

我有一个带有文本视图的布局。 每当我使用从左到右语言环境 OR 删除 android:hint 元素时,它都能正常工作。但是,在具有 LTR 值(英文文本)和重力 =“start”或“end”的 RTL(希伯来语语言环境)中,它只是将文本推入错误方向的提示大小的文本视图中。举个例子可能会更清楚:

LTR 语言环境和文本:

带有提示的 RTL 语言环境和 LTR 文本 - 这里带有重力“end”的“Data A”字段将其推到右侧而不是左侧,因为它是英文的。 “数据B”具有重力“开始”,所以情况相同,只是相反:

提示是一个重要问题,因为当我删除它们时,wrap_content 会缩小视图,布局约束会发挥作用,即使在 RTL 中也能正确显示

这是删除了 android:hints 的相同示例:

LTR 布局编辑器:

基本上,我的问题是如何使文本视图的重要性始终在语言环境的末尾或开头起作用,而不是文本的语言

<android.support.constraint.ConstraintLayout 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"
    style="@style/LogEntryListViewItemStyle"
    android:layout_
    android:layout_
    android:baselineAligned="false"><!--TODO-->

    <ImageView
        android:id="@+id/LogEntryListSelectedFieldField"
        android:layout_
        android:layout_
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/Number"
        android:layout_
        android:layout_
        android:gravity="center"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="@+id/LogEntryListSelectedFieldField"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/DataB"
        android:layout_
        android:layout_
        android:layout_marginStart="8dp"
        android:gravity="start"
        app:layout_constraintStart_toEndOf="@+id/Number"
        app:layout_constraintTop_toTopOf="parent"/>

    <TextView
        android:id="@+id/LogEntryListItemDateTimeField"
        style="@style/LogEntryListItemDateStyle"
        android:layout_
        android:layout_
        android:layout_marginEnd="8dp"
        android:gravity="end"
        app:layout_constraintEnd_toStartOf="@+id/LogEntryListSignedField"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/LogEntryListItemAircraftField"
        style="@style/DataA"
        android:layout_
        android:layout_
        android:gravity="start"
        app:layout_constraintStart_toStartOf="@+id/DataB"
        app:layout_constraintTop_toBottomOf="@+id/DataB" />

   <TextView
       android:id="@+id/DataA"
       style="@style/LogEntryListItemAircraftNameStyle"
       android:layout_
       android:layout_
       android:gravity="end"
       app:layout_constraintEnd_toEndOf="@+id/LogEntryListItemDateTimeField"
       app:layout_constraintTop_toBottomOf="@+id/LogEntryListItemDateTimeField" />

   <android.support.constraint.Barrier
       android:id="@+id/barrier"
       android:layout_
       android:layout_
       app:barrierDirection="bottom"
       app:constraint_referenced_ids="LogEntryListItemAircraftField, DataA" />

   <TextView
       android:id="@+id/LogEntryListItemNotesField"
       style="@style/LogEntryListItemNotesStyle"
       android:layout_
       android:layout_
       android:ellipsize="end"
       android:hint="(Notes)"
       android:maxLines="2"
       app:layout_constraintBottom_toBottomOf="parent"
       app:layout_constraintStart_toStartOf="@+id/DataB"
       app:layout_constraintEnd_toEndOf="@+id/LogEntryListItemDateTimeField"
       app:layout_constraintTop_toBottomOf="@+id/barrier" />

   <ImageView
       android:id="@+id/LogEntryListSignedField"
       android:layout_
       android:layout_
       android:scaleType="center"
       android:src="@drawable/ic_menu_edit"
       app:layout_constraintBottom_toBottomOf="parent"
       app:layout_constraintEnd_toEndOf="parent"
       app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>

【问题讨论】:

不,这不是 maxLines,因为它应该看起来像第一个屏幕截图并使用整个区域 但是第二行的第一个单词很短(“xc xfxfx...”)。为什么第一行没有“xc”? 具有 xc xfxfx 文本的视图的宽度是多少? 它在 xml 文件中 - LogEntryListItemNotesField。基本上是整个宽度。 好吧,没关系,这是我的错误 - 它有换行符...... 【参考方案1】:

我已经在我的设备上进行了检查,它工作正常。请检查一下,看看效果如何。

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
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_
android:layout_
android:baselineAligned="false">

<ImageView
    android:id="@+id/LogEntryListSelectedFieldField"
    android:layout_
    android:layout_
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<TextView
    android:id="@+id/Number"
    android:layout_
    android:layout_
    android:gravity="center"
    android:paddingEnd="10dp"
    android:paddingStart="10dp"
    android:text="20"
    android:textColor="@color/colorPrimaryDark"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintStart_toStartOf="@+id/LogEntryListSelectedFieldField"
    app:layout_constraintTop_toTopOf="parent" />

<TextView
    android:id="@+id/DataB"
    android:layout_
    android:layout_
    android:gravity="start"
    android:text="Data B"
    android:textColor="@color/colorPrimaryDark"
    app:layout_constraintEnd_toStartOf="@+id/guideline2"
    app:layout_constraintStart_toEndOf="@+id/Number" />

<TextView
    android:id="@+id/LogEntryListItemDateTimeField"
    android:layout_
    android:layout_
    android:gravity="end|center_vertical"
    android:text="Hercules (C-130)"
    android:textColor="@color/colorPrimaryDark"
    app:layout_constraintEnd_toStartOf="@+id/LogEntryListSignedField"
    app:layout_constraintStart_toStartOf="@+id/guideline2"
    app:layout_constraintTop_toTopOf="parent" />

<android.support.constraint.Guideline
    android:id="@+id/guideline2"
    android:layout_
    android:layout_
    android:orientation="vertical"
    app:layout_constraintBottom_toTopOf="@+id/LogEntryListItemNotesField"
    app:layout_constraintGuide_percent="0.5" />

<TextView
    android:id="@+id/LogEntryListItemAircraftField"
    android:layout_
    android:layout_
    android:gravity="start"
    android:text="Hercules (C-130)"
    android:textColor="@color/colorPrimaryDark"
    app:layout_constraintEnd_toStartOf="@+id/guideline2"
    app:layout_constraintStart_toEndOf="@+id/Number"
    app:layout_constraintTop_toBottomOf="@+id/DataB" />

<TextView
    android:id="@+id/DataA"
    android:layout_
    android:layout_
    android:gravity="end|center"
    android:text="Data A"
    android:textColor="@color/colorPrimaryDark"
    app:layout_constraintEnd_toEndOf="@+id/LogEntryListItemDateTimeField"
    app:layout_constraintStart_toStartOf="@+id/LogEntryListItemDateTimeField"
    app:layout_constraintTop_toBottomOf="@+id/LogEntryListItemDateTimeField" />

<android.support.constraint.Barrier
    android:id="@+id/barrier"
    android:layout_
    android:layout_
    app:barrierDirection="bottom"
    app:constraint_referenced_ids="LogEntryListItemAircraftField, DataA" />

<TextView
    android:id="@+id/LogEntryListItemNotesField"
    android:layout_
    android:layout_
    android:ellipsize="end"
    android:hint="the hints are an important issue because when I remove them, then wrap_content will shrink the view and the layout constraints do their job and it shows up correctly even in RTL"
    android:maxLines="2"
    android:textSize="12sp"
    android:textStyle="normal"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="@+id/LogEntryListItemDateTimeField"
    app:layout_constraintStart_toEndOf="@+id/Number"
    app:layout_constraintTop_toBottomOf="@+id/barrier" />

    <ImageView
    android:id="@+id/LogEntryListSignedField"
    android:layout_
    android:layout_
    android:scaleType="center"
    android:src="@drawable/ic_menu_edit"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

    </android.support.constraint.ConstraintLayout>

【讨论】:

以上是关于TextView 提示弄乱了 RTL 重力的主要内容,如果未能解决你的问题,请参考以下文章

在TextView中使用locale(ltr / rtl)作为重力

电子邮件表单弄乱了 UTF-8 文本 [重复]

单个textview中的两种不同风格,具有不同的重力和高度

为啥 QTextBrowser 弄乱了我的 HTML 代码?

实体框架弄乱了行 ID

NSJSONSerialization 弄乱了结果 NSDictionary