如何将一个/两个 TextView 设置为另一个 TextView 的高度?

Posted

技术标签:

【中文标题】如何将一个/两个 TextView 设置为另一个 TextView 的高度?【英文标题】:How can I set one/two TextViews to the height of another TextView at its side? 【发布时间】:2021-07-31 03:33:06 【问题描述】:

您好,我有一个包含三个 TextView 的布局。其中一个在左侧(numPreguntaTv),另外两个在右侧(enunciadoPregTv 和 tipoPregItemTv),一个在另一个之上。

我希望 numPreguntaTv 有两行的高度,所以当 enunciadoPregTv 有两行时,它必须与左侧的 numPreguntaTv 具有相同的高度。此外,如果 enunciadoPregTv 只有一行,则 tipoPregItemTv 必须适合第二行。

我想让它们完美(或几乎)对齐。

现在他们是这样的:

如果 enunciadoPregTv 有两行或更多行,那很好,它似乎与 numPreguntaTv 具有相同的高度。但是,如果 enunciadoPregTv 只有一行,则 tipoPregItemTv 不能正确适应第二行。有点低了。

我怎样才能实现我的想法?

这是我的布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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_>

    <TextView
        android:id="@+id/numPreguntaTv"
        android:layout_
        android:layout_
        android:fontFamily="sans-serif-smallcaps"
        android:text="10"
        android:textAlignment="textEnd"
        android:textColor="@color/azul"
        android:textSize="48sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/enunciadoPregTv"
        android:layout_
        android:layout_
        android:layout_marginStart="4dp"
        android:layout_marginTop="4dp"
        android:justificationMode="inter_word"
        android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque in finibus purus. Curabitur ex nisi, aliquam nec turpis quis, mollis consequat diam. In felis nibh, fringilla nec mi eu, tempus iaculis nulla."
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/numPreguntaTv"
        app:layout_constraintTop_toTopOf="@+id/numPreguntaTv" />

    <TextView
        android:id="@+id/tipoPregItemTv"
        android:layout_
        android:layout_
        android:layout_marginStart="56dp"
        android:text="Verdadero o falso"
        android:textStyle="italic"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/enunciadoPregTv" />

    <com.google.android.material.button.MaterialButton
        android:id="@+id/borrarPregButton"
        android:layout_
        android:layout_
        android:layout_gravity="center_horizontal"
        android:layout_marginEnd="8dp"
        app:backgroundTint="@color/rojo"
        app:icon="@drawable/ic_baseline_delete_24"
        app:iconGravity="textStart"
        app:iconPadding="0dp"
        app:layout_constraintEnd_toStartOf="@+id/editarPregButton"
        app:layout_constraintTop_toBottomOf="@+id/tipoPregItemTv" />

    <Button
        android:id="@+id/editarPregButton"
        android:layout_
        android:layout_
        android:text="@string/editar_pregunta_button"
        app:icon="@drawable/ic_baseline_edit_24"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/tipoPregItemTv" />
</androidx.constraintlayout.widget.ConstraintLayout>

谢谢!!

【问题讨论】:

【参考方案1】:

我认为由于您的设置,您的布局似乎(大部分)适合您。当我在 Android Studio 中加载您的布局时,这就是我得到的:

如您所见,事情看起来有些不同。

您可以将 TextView 基线与另一个 TextView 的 基线对齐,以通过app:layout_constraintBaseline_toBaselineOf="@id/otherView" 实现您想要的效果。有两个问题:

    多行 TextView 报告其第一行的基线,但您需要第二行的基线。

    如果右上角的 TextView 有一行,您需要将左上角视图的基线绑定到底部 TextView 的基线。这将意味着约束条件的改变。

问题 #1 可以通过 this 之类的方式处理。对于问题 #2,您需要检测右上 TextView 何时有单行并将左上视图的约束更改为底部视图的基线。您可以使用ViewTreeObserver.OnGlobalLayoutListener 来完成此操作。您可以更改约束,例如 this。

当然,一旦你有一个布局监听器,你可以使用布局监听器在左上角 TextView 的顶部添加边距,使其与第二行的基线对齐的右上角视图。这将针对问题 #1,并且可能是我处理它的方式。

【讨论】:

以上是关于如何将一个/两个 TextView 设置为另一个 TextView 的高度?的主要内容,如果未能解决你的问题,请参考以下文章

为了清楚起见,如何将 MainActivity 功能拆分为另一个类?

如何将 BackgroundWorker 的结果设置为 TextView

在Java Spring中将一个bean的值设置为另一个bean

我们如何将一个 UIView 设置为另一个 UIView 的掩码

如何使用tab控件传递参数

AE中如何将一个图层设置为另一个图层的遮罩层