TextView getLineCount 在包含 "n" 时返回错误的数字



我需要确定文本视图是否包含 3 行或更多文本。如果文本视图包含超过 3 行,我应该显示阅读更多按钮。

这是我用于它的代码:

ViewTreeObserver vto = txtContent.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
ViewTreeObserver obs = txtContent.getViewTreeObserver();
obs.removeGlobalOnLayoutListener(this);
int lineCount = txtContent.getLineCount();
if (lineCount > 3) {
txtReadMore.setVisibility(View.VISIBLE);
} else {
txtReadMore.setVisibility(View.GONE);
}
}
});

当 txt内容文本为 Test\Hhj 时:

"测试

呵呵"

我得到行数 3,尽管数字应该是 4(它有两次返回(。

有没有办法获得正确的数字,或者也许我应该在我的代码中更改某些内容?

TestnnHhj是 3 行:)

Test= 1 行Testn= 2 行Testnn

= 3 行TestnnHhj= 3 行


1. Test
2. 
3. Hhj

感谢大家的贡献,但这个"错误"的原因是我没有意识到在 xml txtContent 中设置了 android:maxLines="3"。

如果设置了最大行数,并且文本视图具有更多行数,则 getLineCount 返回最大行数。删除此行后,在我的情况下,getLineCount 返回 4。

对不起,这个烂摊子。

显示更多/显示更少 如果文本视图包含超过 3 行。

步骤1(在文本视图上设置文本并调用以下方法

tvTitle.setText("any text");
if(tvTitle.getLineCount()>3)
makeTextViewResizable(tvTitle, 3, ".. Read More", true);

步骤2(添加下面给出的两种方法

public static void makeTextViewResizable(final TextView tv, final int maxLine, final String expandText, final boolean viewMore) {
if (tv.getTag() == null) {
tv.setTag(tv.getText());
}
ViewTreeObserver vto = tv.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@SuppressWarnings("deprecation")
@Override
public void onGlobalLayout() {
ViewTreeObserver obs = tv.getViewTreeObserver();
obs.removeGlobalOnLayoutListener(this);
if (maxLine == 0) {
int lineEndIndex = tv.getLayout().getLineEnd(0);
String text = tv.getText().subSequence(0, lineEndIndex - expandText.length() + 1) + " " + expandText;
tv.setText(text);
tv.setMovementMethod(LinkMovementMethod.getInstance());
tv.setText(
addClickablePartTextViewResizable(Html.fromHtml(tv.getText().toString()), tv, maxLine, expandText,
viewMore), TextView.BufferType.SPANNABLE);
}
else if (maxLine > 0 && tv.getLineCount() >= maxLine) {
int lineEndIndex = tv.getLayout().getLineEnd(maxLine - 1);
String text = tv.getText().subSequence(0, lineEndIndex - expandText.length() + 1) + " " + expandText;
tv.setText(text);
tv.setMovementMethod(LinkMovementMethod.getInstance());
tv.setText(
addClickablePartTextViewResizable(Html.fromHtml(tv.getText().toString()), tv, maxLine, expandText,
viewMore), TextView.BufferType.SPANNABLE);
} else {
int lineEndIndex = tv.getLayout().getLineEnd(tv.getLayout().getLineCount() - 1);
String text = tv.getText().subSequence(0, lineEndIndex) + " " + expandText;
tv.setText(text);
tv.setMovementMethod(LinkMovementMethod.getInstance());
tv.setText(
addClickablePartTextViewResizable(Html.fromHtml(tv.getText().toString()), tv, lineEndIndex, expandText,
viewMore), TextView.BufferType.SPANNABLE);
}
}
});
}
private static SpannableStringBuilder addClickablePartTextViewResizable(final Spanned strSpanned, final TextView tv,
      final int maxLine, final String spanableText, final boolean viewMore) {
String str = strSpanned.toString();
SpannableStringBuilder ssb = new SpannableStringBuilder(strSpanned);
if (str.contains(spanableText)) {

ssb.setSpan(new MySpannable(false) {
@Override
public void onClick(View widget) {
if (viewMore) {
tv.setLayoutParams(tv.getLayoutParams());
tv.setText(tv.getTag().toString(), TextView.BufferType.SPANNABLE);
tv.invalidate();
makeTextViewResizable(tv, -1, ".. Show Less", false);
} else {
tv.setLayoutParams(tv.getLayoutParams());
tv.setText(tv.getTag().toString(), TextView.BufferType.SPANNABLE);
tv.invalidate();
makeTextViewResizable(tv, 2, ".. Show More", true);
}
}
}, str.indexOf(spanableText), str.indexOf(spanableText) + spanableText.length(), 0);
}
return ssb;
}

希望它对你有用。 如果您发现任何查询,请告诉我。 我的灵感来自 https://stackoverflow.com/a/30636164/7727011

最新更新