【问题标题】:LinearLayout how to make TextView wrap content with limit?LinearLayout 如何使 TextView 用限制包装内容?
【发布时间】:2021-07-06 03:47:58
【问题描述】:

我想在一个水平 LinearLayout 中显示 2 个 TextView,第一个 TextView 是可变的,它的长度可能会改变。第二个总是(B)。所以我想要这样的东西:

|AAA(B)--------|

当A很长时,它应该在中间显示椭圆:

|AAAA...AAAA(B)|

为了解决这个问题,我尝试为 A 包装内容:

<LinearLayout orientation="Horizontal" width="match_parent">
    <TextView id="@+id/A" width="wrap_content" />
    <TextView id="@+id/B" width="wrap_content" />
</LinearLayout>

但是当A很长时,B会消失。变成了

|啊啊啊啊啊|

我也尝试添加 layout_weight:

<LinearLayout orientation="Horizontal" width="match_parent">
    <TextView id="@+id/A" width="wrap_content" layout_weight="1" />
    <TextView id="@+id/B" width="wrap_content" />
</LinearLayout>

但是当A很短的时候就有问题了,A和B之间有多余的空间,就变成了

|AAA-----(B)| (“-”代表空格)

我不想要这里的空间。

有没有办法让 wrap_content 有最大限制?

【问题讨论】:

    标签: android


    【解决方案1】:

    您可以使用约束布局来实现这一点。

     <?xml version="1.0" encoding="utf-8"?>
     <androidx.constraintlayout.widget.ConstraintLayout  
         xmlns:app="http://schemas.android.com/apk/res-auto"
         xmlns:tools="http://schemas.android.com/tools"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         tools:context=".presentation.list.CampaignListActivity">
    
        <TextView
            android:id="@+id/A"
            android:layout_width="0dp"
            android:maxLines="1"
            android:ellipsize="middle"
            android:text="AAAAAAAAAAAAAAAAAAAAAAAA"
            android:layout_height="wrap_content"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintEnd_toStartOf="@id/B"
            app:layout_constraintStart_toStartOf="parent"/>
    
        <TextView
           android:id="@+id/B"
           android:layout_width="0dp"
           android:maxLines="1"
           android:ellipsize="middle"
           android:text="BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
           android:layout_height="wrap_content"
           app:layout_constraintTop_toTopOf="parent"
           app:layout_constraintStart_toEndOf="@id/A"
           app:layout_constraintEnd_toEndOf="parent"/>
    
     </androidx.constraintlayout.widget.ConstraintLayout>
    

    【讨论】:

    • 这不起作用。当A很短时,两者都会占用一半空间,它变成|A-----(B)-----|
    【解决方案2】:

    给你!

    <androidx.cardview.widget.CardView
            android:id="@+id/cardView7"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
    
            <androidx.constraintlayout.widget.ConstraintLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">
    
                <TextView
                    android:id="@+id/tv_A"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:text="this is a long text field kdsalfj lksadjlfja sdljfljas dlfjlas djflk js dalk and this text is more than 20fj"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintEnd_toStartOf="@+id/tv_B"
                    app:layout_constraintHorizontal_bias="0.5"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent" />
    
                <TextView
                    android:id="@+id/tv_B"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Less Text"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintHorizontal_bias="0.5"
                    app:layout_constraintStart_toEndOf="@+id/tv_A"
                    app:layout_constraintTop_toTopOf="parent" />
            </androidx.constraintlayout.widget.ConstraintLayout>
        </androidx.cardview.widget.CardView>
    

    然后在您的 OnCreate 方法中添加以下代码:

    if (tvA.text.length > 50) {
       tvA.text = "${tvA.text.take(20)}...${tvA.text.takeLast(20)}"
    }
    

    您必须在某处添加上述代码行,以便在启动 Activity 时执行它们(例如在 Activity 的 OnCreate() 函数中)

    【讨论】:

    • "${tvA.text.take(20)}...${tvA.text.takeLast(20)}" 我们如何确保显示 46 个字符?
    • 将 46 分成两半,然后在 take(23) 中添加 23,在 takeLast(23) 中添加 23。同样,如果您想要包括点在内的 46 个字符,则放置小于 23 的内容。
    【解决方案3】:

    使用水平线性布局,您可以使用android:layout_weight="1" 到变量TextView A 和android:layout_weight="0" 到固定的TextView B 来实现这一点。LinearLayout 必须有android:layout_width="wrap_content"

    xml结构如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
    
        <TextView
            android:id="@+id/A"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:ellipsize="middle"
            android:text="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
            android:background="@android:color/holo_blue_light"
            android:layout_weight="1"
            android:singleLine="true" />
    
        <TextView
            android:id="@+id/B"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:ellipsize="middle"
            android:text="B"
            android:background="@android:color/holo_red_light"
            android:layout_weight="0"
            android:singleLine="true"/>
    
    </LinearLayout>
    

    A 为空时的结果:

    A 为长时的结果:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-22
      • 1970-01-01
      相关资源
      最近更新 更多