Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java TextView getLineCount包含“时返回错误的数字”\";_Java_Android_Textview - Fatal编程技术网

Java TextView getLineCount包含“时返回错误的数字”\";

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(

我需要确定textview是否包含3行或更多文本。如果textview包含超过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);
      }
    }
  });
当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行,那么有解决方案可以解决这个问题吗?你能给我们发一个屏幕截图吗?