android计算textview一行能显示多少个字

第一次发博客 不喜勿喷
项目有一个需求,显示文字的时候,如果字数超过两行,则显示省略号,然后在后面显示标红的“更多”(如下图所示)
在这里插入图片描述
我打算用混合文本SpannableString去完成,这样的话就得知道textview的每行要显示多少个字。然而不同的手机屏幕分辨率显示字数会有所不同,我的做法如下:
首先获取到目标TextView的宽度,如果TextView的宽度是match_parent,那么就是屏幕宽,如果是固定宽,则将dp转换成px,如果是比重宽,则用屏幕宽除以比重,总之是有办法获取到的。我这里宽度是match_parent,然后左右各有10个dp的padding,就是手机屏幕宽减去20个dp转换成px的宽。

获取手机屏幕宽度:
DisplayMetrics dm = getResources().getDisplayMetrics();
int width = dm.widthPixels;

获取到目标TextView的宽度之后,得到textview每个字的宽度,即:
textview.getTextSize()

然后用TextView的宽除以字宽,就能得到每一行能显示多少个字了。

接下来的内容就是怎样设置textview的SpannableString

int width = (MyApplication.getInstance().width - DimensionConversionUtil.dip2px(this, 20));
int num = Math.round(width / textview.getTextSize());
//这里需要显示两行字,所以是num*2
//减4是为了加上省略号和“更多”二字
showString = bean.getIntro().substring(0, num * 2 - 4) + “……更多”;
spannableString = new SpannableString(showString);
ForegroundColorSpan colorSpan2 = new ForegroundColorSpan(Color.parseColor("#fd3333"));
spannableString.setSpan(colorSpan2, showString.length() - 2, showString.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

点击更多展开:
clickableSpan = new ClickableSpan() {
@Override
public void onClick(View view) {
// L.e("--------clickableSpan---->>>>>>>>>>>>>");
if (isShow) {//已展开
showString = bean.getIntro().substring(0, num * 2 - 4) + “…… 更多”;
} else {//未展开
showString = bean.getIntro() + " 收起";
}
isShow = !isShow;
spannableString = new SpannableString(showString);
ForegroundColorSpan colorSpan2 = new ForegroundColorSpan(Color.parseColor("#fd3333"));
spannableString.setSpan(colorSpan2, showString.length() - 2, showString.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
spannableString.setSpan(clickableSpan, showString.length() - 2, showString.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

tv_intro.setMovementMethod(LinkMovementMethod.getInstance());
tv_intro.setText(spannableString);
}

@Override
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
}
};
spannableString.setSpan(clickableSpan, showString.length() - 2, showString.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);

//如果点击事件无效 则加入这行
textview.setMovementMethod(LinkMovementMethod.getInstance());
textview.setText(spannableString);

你可能感兴趣的:(android,android)