Android - ConstraintLayout -大文本的椭圆形结尾

5fjcxozz  于 2022-11-20  发布在  Android
关注(0)|答案(5)|浏览(156)

我需要一些关于Android布局的帮助。我有以下代码:

<?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_width="match_parent"
android:layout_height="wrap_content">

<android.support.constraint.Guideline
    android:id="@+id/guideline"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.5" />

<android.support.constraint.Guideline
    android:id="@+id/guideline2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_constraintGuide_percent="0.725" />

<TextView
    android:id="@+id/data_field_1_name"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="10dip"
    android:layout_marginTop="10dip"
    app:layout_constraintLeft_toLeftOf="@id/guideline"
    app:layout_constraintRight_toLeftOf="@id/guideline2"
    app:layout_constraintTop_toTopOf="parent"
    tools:text="ACTIVE" />

<TextView
    android:id="@+id/data_field_1_value"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="15dip"
    android:layout_toEndOf="@id/data_field_1_name"
    app:layout_constraintBaseline_toBaselineOf="@id/data_field_1_name"
    app:layout_constraintLeft_toLeftOf="@id/guideline2"
    app:layout_constraintRight_toRightOf="parent"
    tools:text="1750" />

<TextView
    android:id="@+id/data_field_2_name"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="10dip"
    android:layout_marginTop="8dip"
    app:layout_constraintLeft_toLeftOf="@id/guideline"
    app:layout_constraintRight_toLeftOf="@id/guideline2"
    app:layout_constraintTop_toBottomOf="@id/data_field_1_name"
    tools:text="ACTIVE" />

<TextView
    android:id="@+id/data_field_2_value"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="15dip"
    android:layout_toEndOf="@id/data_field_2_name"
    app:layout_constraintBaseline_toBaselineOf="@id/data_field_2_name"
    app:layout_constraintLeft_toLeftOf="@id/guideline2"
    app:layout_constraintRight_toRightOf="parent"
    tools:text="1750" />

<TextView
    android:id="@+id/data_field_3_name"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="10dip"
    android:layout_marginTop="8dip"
    app:layout_constraintLeft_toLeftOf="@id/guideline"
    app:layout_constraintRight_toLeftOf="@id/guideline2"
    app:layout_constraintTop_toBottomOf="@id/data_field_2_name"
    tools:text="ACTIVE" />

<TextView
    android:id="@+id/data_field_3_value"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="15dip"
    android:layout_toEndOf="@id/data_field_3_name"
    app:layout_constraintBaseline_toBaselineOf="@id/data_field_3_name"
    app:layout_constraintLeft_toLeftOf="@id/guideline2"
    app:layout_constraintRight_toRightOf="parent"
    tools:text="1750" />

<TextView
    android:id="@+id/value"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="15dip"
    android:layout_marginStart="15dip"
    android:textSize="25sp"
    app:layout_constraintBaseline_toBaselineOf="@id/data_field_2_name"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintLeft_toLeftOf="parent"
    tools:text="17.40" />

<ImageView
    android:id="@+id/flag"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginEnd="0dp"
    android:layout_marginTop="2dp"
    android:src="@drawable/ic_launcher_background"
    app:layout_constraintEnd_toEndOf="@+id/unit"
    app:layout_constraintStart_toStartOf="@+id/unit"
    app:layout_constraintTop_toTopOf="parent" />

<android.support.v7.widget.AppCompatTextView
    android:id="@+id/unit"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="2dp"
    android:gravity="center_horizontal"
    app:layout_constraintBaseline_toBaselineOf="@id/value"
    app:layout_constraintStart_toEndOf="@+id/value"
    tools:text="KG" />

<TextView
    android:id="@+id/label"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="15dip"
    app:layout_constraintBaseline_toBaselineOf="@id/data_field_3_name"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toLeftOf="@id/guideline"
    tools:text="TOTAL" />
</android.support.constraint.ConstraintLayout>

输出为:

我的问题是:如果主值(17.40)太大,则该值应“省略”以结束,但它会覆盖“活动”文本。
大文本的输入为:

我需要像这样的东西大价值:

PS:单位和标志应始终显示在主值的末尾。
你能帮我提些建议吗?我试了很多办法,但没有找到解决办法。

lyr7nygr

lyr7nygr1#

1.将子布局宽度设置为0dp

安卓系统:布局宽度=“0 dp”

  1. Set Right_toRightOfLeft_toRightOf

**应用程序:layout_constraintLeft_to RightOf ="@+id/列表图像视图”****应用程序:layout_constraintRight_to RightOf =“父级”**应用程序:layout_constraintTop_to TopOf =“父级”

zqry0prt

zqry0prt2#

首先,您需要将android:ellipsize="end"android:maxLines="1"添加到TextView android:id="@+id/value"中。然后,您需要将 valueunit 添加到水平链中。将链的开始连接到父级开始,将链的结束连接到准则android:id="@+id/guideline"的开始/结束。
之后,valueunit 将具有相同的宽度,并填充父开始和基准线android:id="@+id/guideline"之间的整个空间。要使宽度不同,您可以将android:layout_width="wrap_content"设置为 unit,或者您可以将两者都设置为app:layout_constraintHorizontal_weight
代码可以是这样的:

<TextView
    android:id="@+id/value"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="15dip"
    android:layout_marginStart="15dip"
    android:textSize="25sp"
    android:ellipsize="end"
    android:maxLines="1"
    app:layout_constraintBaseline_toBaselineOf="@id/data_field_2_name"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintHorizontal_chainStyle="packed"
    app:layout_constraintEnd_toStartOf="@+id/unit"
    tools:text="17.40000000" />

<android.support.v7.widget.AppCompatTextView
    android:id="@+id/unit"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginStart="2dp"
    android:gravity="center_horizontal"
    android:maxLines="1"
    android:layout_marginEnd="8dp"
    app:layout_constraintBaseline_toBaselineOf="@id/value"
    app:layout_constraintStart_toEndOf="@+id/value"
    app:layout_constraintEnd_toStartOf="@+id/guideline"
    tools:text="KG" />

它将如下所示:

bvjveswy

bvjveswy3#

为了那个
1)您必须为其指定固定长度,textview宽度0dp将不起作用。
2)需要将文本视图的ellipsize属性设置为“end”。
3)沿着将maxlines属性设置为1。
测试了这个,工作正常。

你可以保持固定的宽度,因为你喜欢。

<TextView
    android:id="@+id/value"
    android:layout_width="140dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="15dip"
    android:ellipsize="end"
    android:maxLines="1"
    android:layout_marginStart="15dip"
    android:textSize="25sp"
    app:layout_constraintBaseline_toBaselineOf="@id/data_field_2_name"
    app:layout_constraintHorizontal_bias="0.0"
    app:layout_constraintLeft_toLeftOf="parent"
    tools:text="17.40000000000000" />
7jmck4yq

7jmck4yq4#

假设您已经将valueTextView设置为自身的ellipsize,您可以通过在ConstraintLayout完成所有视图的布局后以编程方式设置TextView的最大宽度来解决这个问题。
我创建了一个小应用程序,它只是扩大了你在问题中发布的布局(尽管我不得不将旗帜更改为我拥有的图片)。我将这些属性添加到value视图中:

android:maxLines="1"
    android:ellipsize="end"

这是我的Java代码:

public class MainActivity extends AppCompatActivity {

    private TextView value;
    private TextView data2;
    private TextView unit;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        value = (TextView) findViewById(R.id.value);
        data2 = (TextView) findViewById(R.id.data_field_2_name);
        unit = (TextView) findViewById(R.id.unit);

        value.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                    value.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                }
                else {
                    value.getViewTreeObserver().removeGlobalOnLayoutListener(this);
                }

                setMaxWidth();
            }
        });
    }

    private void setMaxWidth() {
        ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) value.getLayoutParams();

        int maxWidth = data2.getLeft() - value.getLeft();
        int maxWidthConsideringUnits = maxWidth - unit.getWidth();
        int maxWidthIncludingMargin = maxWidthConsideringUnits - params.getMarginEnd();

        value.setMaxWidth(maxWidthIncludingMargin);
    }
}

以下是一些截图:
第一次

wgxvkvu9

wgxvkvu95#

我们走吧。

<TextView
        android:id="@+id/value"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:textSize="25sp"
        android:ellipsize="end"
        android:singleLine="true"
        app:layout_constrainedWidth="true"
        app:layout_constraintHorizontal_chainStyle="packed"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@id/unit"
        tools:text="17.40000" />

    <TextView
        android:id="@+id/unit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="2dp"
        app:layout_constraintBaseline_toBaselineOf="@id/value"
        app:layout_constraintStart_toEndOf="@+id/value"
        app:layout_constraintEnd_toEndOf="@id/guideline"
        tools:text="KG" />

请注意,请确保父ConstraintLayoutLayoutParam.width不是wrap_content

相关问题