1. 程式人生 > 其它 >「省略…」中間文字自適應省略實現

「省略…」中間文字自適應省略實現

技術標籤:javaandroid安卓

產生原因:公司現有需求要求有其中一段文字自適應,之前經驗以為不管在什麼佈局裡面,內容只要設定了寬度就一定會顯示出來,事實證明,會被文字內容擠走,所以設定的父容器的寬度實質上只是容器寬度,而不是實質的內容寬度,舉例如下:

<?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/tvOne" android:layout_width="wrap_content" android:layout_height="wrap_content" android:
gravity
="end" android:text="" />
<TextView android:id="@+id/tvTwo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:singleLine="true" android:text="
省略省略省略省略省略省略省略省略省略省略省略省略省略省略省略省略省略省略省略省略"
/>
<TextView android:id="@+id/tvMain" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="" /> </LinearLayout>

在這裡插入圖片描述
如圖:右邊的小括號被省略了,所以無法顯示出想要的效果。
解決方式:
1.多層佈局巢狀:

<?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">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/tvOne"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="end"
            android:text="" />

        <TextView
            android:id="@+id/tvTwo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:singleLine="true"
            android:text="省略省略省略省略省略省略省略省略省略省略省略省略省略省略省略省略省略省略省略省略" />

        <TextView
            android:id="@+id/tvMain"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="" />
    </LinearLayout>

</LinearLayout>

建議:並不建議這樣做,因為佈局巢狀層數太深,會導致效能不好,嚴重的會出現StackOverflowError異常
2.設定一個佔位的文字,監聽textview的行數變化,超過一行則顯示,多行同理

tvEndPoint.setText(String.format("「%s」", s));
        tvEndPoint.post(() -> {
            Layout layout = tv.getLayout();
            if (layout != null) {
                int lines = layout.getLineCount();
                if (lines > 0) {
                    if (layout.getEllipsisCount(lines - 1) > 0) {
                        tvEndPlace.setVisibility(View.VISIBLE);
                    } else {
                        tvEndPlace.setVisibility(View.GONE);
                    }
                } else {
                    tvEndPlace.setVisibility(View.GONE);
                }
            }
        });