当前位置:   article > 正文

Android中TextView文本或富文本内容自行换行的问题_textview富文本换行

textview富文本换行

Android中TextView设置文本或富文本的时候出现没有到头就换行的问题.

 网上有很多相关内容. 但大多都是关于文本换行的情况, 对于有富文本内容的情况, 如设置Spanned对象的内容, 会出现颜色等内容丢失的情况.  在此基础上添加富文本内容的处理.  之前代码不知道原出处在哪, 在此借用一下.

如图显示内容:

 

废话少说, 上菜~~~~~~

1.对TextView进行监听.

  1. private void initAutoSplitTextView() {
  2. mContent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
  3. @Override
  4. public void onGlobalLayout() {
  5. mContent.getViewTreeObserver().removeOnGlobalLayoutListener(this);
  6. final CharSequence newText = autoSplitText(mContent);
  7. if (!TextUtils.isEmpty(newText)) {
  8. mContent.setText(newText);
  9. }
  10. }
  11. });
  12. }

2.对TextView显示内容的拆分.

  1. //返回CharSequence对象
  2. private CharSequence autoSplitText(final TextView tv) {
  3. //tv.getText(), 原始的CharSequence内容.
  4. CharSequence charSequence = tv.getText();
  5. final String rawText = tv.getText().toString(); //原始文本
  6. final Paint tvPaint = tv.getPaint(); //paint,包含字体等信息
  7. final float tvWidth = tv.getWidth() - tv.getPaddingLeft() - tv.getPaddingRight(); //控件可用宽度
  8. //将原始文本按行拆分
  9. String[] rawTextLines = rawText.replaceAll("\r", "").split("\n");
  10. StringBuilder sbNewText = new StringBuilder();
  11. for (String rawTextLine : rawTextLines) {
  12. if (tvPaint.measureText(rawTextLine) <= tvWidth) {
  13. //如果整行宽度在控件可用宽度之内,就不处理了
  14. sbNewText.append(rawTextLine);
  15. } else {
  16. //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行
  17. float lineWidth = 0;
  18. for (int cnt = 0; cnt != rawTextLine.length(); ++cnt) {
  19. char ch = rawTextLine.charAt(cnt);
  20. lineWidth += tvPaint.measureText(String.valueOf(ch));
  21. if (lineWidth <= tvWidth) {
  22. sbNewText.append(ch);
  23. } else {
  24. sbNewText.append("\n");
  25. lineWidth = 0;
  26. --cnt;
  27. }
  28. }
  29. }
  30. sbNewText.append("\n");
  31. }
  32. //把结尾多余的\n去掉
  33. if (!rawText.endsWith("\n")) {
  34. sbNewText.deleteCharAt(sbNewText.length() - 1);
  35. }
  36. //对于有富文本的情况
  37. if (charSequence instanceof Spanned) {
  38. SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(charSequence);
  39. if (sbNewText.toString().contains("\n")) {
  40. String[] split = sbNewText.toString().split("\n");
  41. int tempIndex = 0;
  42. for (int i = 0; i < split.length; i++) {
  43. if (i != split.length - 1) {
  44. String s = split[i];
  45. tempIndex = tempIndex + s.length() + i;
  46. spannableStringBuilder.insert(tempIndex, "\n");
  47. }
  48. }
  49. }
  50. return spannableStringBuilder;
  51. } else {
  52. return sbNewText;
  53. }
  54. }

 

随手Mark, 如有问题留言一块探讨.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/242761
推荐阅读
相关标签
  

闽ICP备14008679号