产生原因:公司现有需求要求有其中一段文本自适应,之前经验以为不管在什么布局里面,内容只要设置了宽度就一定会显示出来,事实证明,会被文本内容挤走,所以设置的父容器的宽度实质上只是容器宽度,而不是实质的内容宽度,举例如下:
<?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);
}
}
});