Java TextView getLineCount包含“时返回错误的数字”\";
我需要确定textview是否包含3行或更多文本。如果textview包含超过3行,我应该显示“阅读更多”按钮 这是我使用的代码:Java TextView getLineCount包含“时返回错误的数字”\";,java,android,textview,Java,Android,Textview,我需要确定textview是否包含3行或更多文本。如果textview包含超过3行,我应该显示“阅读更多”按钮 这是我使用的代码: ViewTreeObserver vto = txtContent.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout(
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);
}
}
});
当txtContent文本为Test\n\nHhj时:
“试验
Hhj“
我得到行计数3,虽然数字应该是4(它有两次返回)
有没有办法得到正确的数字,或者我应该修改代码中的某些内容?
Test\n\nHhj
是3行:)
测试
=1行Test\n
=2行测试\n\n
=3行测试\n\nHhj
=3行
1. Test
2.
3. Hhj
Test\n\nHhj
is 3行:)
测试
=1行Test\n
=2行测试\n\n
=3行测试\n\nHhj
=3行
1. Test
2.
3. Hhj
如果textview包含超过3行,则显示更多/显示更少 步骤1)在textview上设置文本并调用以下方法
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;
}
希望对你有用。
如果您有任何疑问,请告诉我。
我的灵感来源于如果文本视图包含超过3行,则显示更多/显示更少 步骤1)在textview上设置文本并调用以下方法
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;
}
希望对你有用。
如果您有任何疑问,请告诉我。
我的灵感来源于感谢大家的贡献,但这个“错误”的原因是我没有意识到在xml中txtContent设置了android:maxLines=“3” 如果设置了最大行数且textview有更多行数,则getLineCount返回最大行数。在我的例子中,删除此行后,getLineCount返回4
很抱歉造成这种混乱。感谢大家的贡献,但出现这种“错误”的原因是我没有意识到在xml中txtContent设置了android:maxLines=“3” 如果设置了最大行数且textview有更多行数,则getLineCount返回最大行数。在我的例子中,删除此行后,getLineCount返回4
对不起,这里太乱了。我得到了行计数3,虽然数字应该是4(它有两次返回)。-此语句是错误的。@Zoran 3是正确答案,因为测试是line1\n转到line2\n转到line3,Hhj将在line3。好的,谢谢您的输入,但是textview显示了4行,那么有没有解决方案可以解决此问题?也许您可以计算字符串中的
\n
数?我得到了行数3,虽然数字应该是4(它有两次返回)。-此语句是错误的。@Zoran 3是正确答案,因为测试是line1\n转到line2\n转到line3,Hhj将在line3。好的,谢谢您的输入,但是textview显示了4行,所以有解决方案可以解决此问题吗?也许您可以计算字符串中\n
的数量?好的,谢谢您的输入,但是textview显示了4行,那么有解决方案可以解决这个问题吗?你能给我们发一个屏幕截图吗?好的,谢谢你的输入,但是textview显示了4行,那么有解决方案可以解决这个问题吗?你能给我们发一个屏幕截图吗?