记录Android TextView在设置ellipsize时出现空白的问题
2021-8-23
设置android:maxLine=“1”,会导致textView后面有一段空白,而设置android:singLine="true"不会(即使它被标记为@deprecated) 建议使用android:singLine=“true”
实际上,就算设置了singleLine=“true”,也不是说textView.getLayout().getLineWidth()就一定等于textView.getWidth()(即:文字宽度和textView的宽度仍然有可能不相等)
如果textView的宽度不足以放下整数个字符时,剩下空间仍会保留在TextView中,然而设计师不想要这部分空白,要求把多余的空白去掉。 两种方法
- 自己计算textView的宽度和它最多能放多少个字符,自己设置省略号,可以去看下android.text.TextUtils.ellipsize(CharSequence, TextPaint, float, TextUtils.TruncateAt, boolean, TextUtils.EllipsizeCallback),然后计算要显示的文本宽度,再将textView的宽度设置成文本宽度。
- 利用post方法,获取textView中省略后的文本宽度,再将textView的宽度设置成文本宽度,请求重新布局(子view会向上请求父view重新布局)
textView.post(new Runnable() {
@Override
public void run() {
if (textView.getWidth() != (int) textView.getLayout().getLineWidth(0)) {
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams((int) textView.getLayout().getLineWidth(0), ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.gravity = Gravity.CENTER_VERTICAL;
textView.setLayoutParams(layoutParams);
textView.requestLayout();
}
}
});
这两个方法本质都是一样的,只不过一个是手动计算,一个是等textView自己去计算后再用它计算出来的结果,后者之所以要用post方法是因为在Activity中onCreate时,textView.getLayout()为null,所有的view还没有measure和layout(有关measure()和layout()两者的关系就不介绍了)。
注意,在复杂的布局中如果使用第一种方法会有很大的工作量
|