「省略…」中間文字自適應省略實現
阿新 • • 發佈:2021-02-02
產生原因:公司現有需求要求有其中一段文字自適應,之前經驗以為不管在什麼佈局裡面,內容只要設定了寬度就一定會顯示出來,事實證明,會被文字內容擠走,所以設定的父容器的寬度實質上只是容器寬度,而不是實質的內容寬度,舉例如下:
<?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);
}
}
});