Android TextView截断优先级或压缩阻力

Sto*_*nz2 10 xml android truncation textview

我正在屏幕上水平布置3个视图(固定大小的图像和2个单行文本视图:leftTextViewrightTextView)我正试图rightTextView让它拥抱leftTextView,但是如果两个标签的宽度都会超过屏幕大小,截断leftTextiew.

所需功能的示例:

|img|leftText|rightText|                ||(end of screen)
|img|leftTextMedium|rightText|          ||
|img|leftTextTooLongSoTrunc...|rightText||
Run Code Online (Sandbox Code Playgroud)

实际发生了什么:

|img|leftText|rightText|                ||(end of screen)
|img|leftTextPrettyLongButNotHuge|rightT||
|img|leftTextWhichIsIncrediblyLongBlahBl||
Run Code Online (Sandbox Code Playgroud)

目前,如果两个文本视图的大小都超过了视图的宽度,那么rightTextView最终会被压缩以腾出空间,即使我已经设置android:ellipsize="end"leftTextView.

有没有办法让它leftTextView具有"截断优先级",表示它应该截断,如果它会导致其他视图不适合?或者在另一方面,我可以设置rightTextView为具有"抗压性"以防止它被挤压以为其腾出空间leftTextView吗?这是我的XML示例:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/fixedWidthImage"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <TextView
        android:id="@+id/leftTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toEndOf="@+id/fixedWidthImage"
        android:layout_toRightOf="@id/fixedWidthImage"
        android:maxLines="1"
        android:textSize="18sp"
        android:ellipsize="end" />

    <TextView
        android:id="@+id/rightTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toEndOf="@+id/leftTextView"
        android:layout_toRightOf="@+id/leftTextView"
        android:layout_alignParentEnd="true"
        android:layout_alignParentRight="true"
        android:maxLines="1"
        android:textSize="12sp" />

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

我试过的事情:

  1. leftTextView添加一个toStartOf/ toLeftOf所述rightTextView(崩溃应用)
  2. 而不是将其对齐rightTextView到末尾/右侧,将其leftTextView翻转并对齐leftTextView到开头/左侧rightTextView.这导致rightTextView被锚定到屏幕的末端而不是直接到屏幕的右侧leftTextView.最终看起来如何:

    |img|leftText                 |rightText||
    |img|leftTextMedium           |rightText||
    |img|leftTextTooLongSoTrunc...|rightText||
    
    Run Code Online (Sandbox Code Playgroud)
  3. 即使我设置android:minWidth="25dp"只是为了确保至少部分rightTextView是可见的(我不想这样做,因为这个文本长度是可变的),它最终还是压缩宽度以腾出空间leftTextView.

  4. 根据伊曼纽尔·莫克林的回答,我试着把它包裹起来LinearLayout并设定重量leftTextView.结果在视觉上与我在#2中尝试的相同.

nsh*_*ura 11

您可以通过存档该布局TableLayoutshrinkColumns属性.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <!-- Row 1 -->
    <TableLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:shrinkColumns="1">

        <TableRow
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center_vertical">

            <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@mipmap/ic_launcher"/>

            <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="4dp"
                    android:maxLines="1"
                    android:ellipsize="end"
                    android:text="leftText"/>

            <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="4dp"
                    android:maxLines="1"
                    android:ellipsize="none"
                    android:text="rightText"/>
        </TableRow>

    </TableLayout>


    <!-- Row 2 -->
    <TableLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:shrinkColumns="1">

        <TableRow
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center_vertical">

            <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@mipmap/ic_launcher"/>

            <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="4dp"
                    android:maxLines="1"
                    android:ellipsize="end"
                    android:text="leftTextPrettyLongButNotHuge"/>

            <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="4dp"
                    android:maxLines="1"
                    android:ellipsize="none"
                    android:text="rightText"/>
        </TableRow>

    </TableLayout>

    <!-- Row 3 -->
    <TableLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:shrinkColumns="1">

        <TableRow
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center_vertical">

            <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@mipmap/ic_launcher"/>

            <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="4dp"
                    android:maxLines="1"
                    android:ellipsize="end"
                    android:text="leftTextWhichIsIncrediblyLongBlahBlahBlahBlah"/>

            <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:padding="4dp"
                    android:maxLines="1"
                    android:ellipsize="none"
                    android:text="rightText"/>
        </TableRow>

    </TableLayout>

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Ema*_*lin 6

这就是我所做的:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/fixedWidthImage"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@drawable/ic_launcher_pro" />

    <TextView
        android:id="@+id/leftTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_gravity="center_vertical|left"
        android:ellipsize="marquee"
        android:lines="1"
        android:text="This is a very long text, and now even longer" />

    <TextView
        android:id="@+id/rightTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|left"
        android:lines="1"
        android:text="This is also quite long" />

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

android:layout_weight=”1” 在这里做了“技巧”。不过,文档对此不太清楚:

例如,如果有三个文本字段,其中两个声明权重为 1,而另一个未指定权重,则第三个没有权重的文本字段将不会增长,只会占用其内容所需的区域。

https://developer.android.com/guide/topics/ui/layout/linear.html#Weight

它没有详细说明没有空间可填充但没有足够空间容纳所有视图的情况。对上述文档的一种解释是,没有权重的字段(本例中为 rightTextView)将占据其内容所需的区域,而具有权重的字段(本例中为 leftTextView)将“增长”(如负数)增长),而这正是所发生的情况。