博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 解决TextView设置文本和富文本SpannableString自动换行留空白问题
阅读量:4077 次
发布时间:2019-05-25

本文共 2894 字,大约阅读时间需要 9 分钟。

TextView设置文本和富文本换行留白问题

效果图对比

下面是设置普通文本的效果对比图:

下面是设置富文本的效果对比图:

解决方案

重新测量文字宽度,设置换行:

private void initAutoSplitTextView() {        mTv.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {            @Override            public void onGlobalLayout() {                mTv.getViewTreeObserver().removeOnGlobalLayoutListener(this);                final CharSequence newText = autoSplitText(mTv);                if (!TextUtils.isEmpty(newText)) {                    mTv.setText(newText);                }            }        });    }    //返回CharSequence对象    private CharSequence autoSplitText(final TextView tv) {        //tv.getText(), 原始的CharSequence内容.        CharSequence charSequence = tv.getText();        final String rawText = tv.getText().toString(); //原始文本        final Paint tvPaint = tv.getPaint(); //paint,包含字体等信息        final float tvWidth = tv.getWidth() - tv.getPaddingLeft() - tv.getPaddingRight(); //控件可用宽度        //将原始文本按行拆分        String[] rawTextLines = rawText.replaceAll("\r", "").split("\n");        StringBuilder newStringBuilder = new StringBuilder();        for (String rawTextLine : rawTextLines) {            if (tvPaint.measureText(rawTextLine) <= tvWidth) {                //如果整行宽度在控件可用宽度之内,就不处理了                newStringBuilder.append(rawTextLine);            } else {                //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行                float lineWidth = 0;                for (int cnt = 0; cnt != rawTextLine.length(); ++cnt) {                    char ch = rawTextLine.charAt(cnt);                    lineWidth += tvPaint.measureText(String.valueOf(ch));                    if (lineWidth <= tvWidth) {                        newStringBuilder.append(ch);                    } else {                        newStringBuilder.append("\n");                        lineWidth = 0;                        --cnt;                    }                }            }            newStringBuilder.append("\n");        }        //把结尾多余的\n去掉        if (!rawText.endsWith("\n")) {            newStringBuilder.deleteCharAt(newStringBuilder.length() - 1);        }        //对于有富文本的情况        if (charSequence instanceof Spanned) {            SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder(charSequence);            if (newStringBuilder.toString().contains("\n")) {                String[] split = newStringBuilder.toString().split("\n");                int tempIndex = 0;                for (int i = 0; i < split.length; i++) {                    if (i != split.length - 1) {                        String s = split[i];                        tempIndex = tempIndex + s.length() + i;                        spannableStringBuilder.insert(tempIndex, "\n");                    }                }            }            return spannableStringBuilder;        } else {            return newStringBuilder;        }    }

转载地址:http://szsni.baihongyu.com/

你可能感兴趣的文章
[转]开源中最好的Web开发的资源
查看>>
java接口不能实例化原因浅谈
查看>>
Https加密及攻防
查看>>
Java生成随机不重复推广码邀请码
查看>>
Java8 Lambda表达式介绍
查看>>
【JAVA数据结构】双向链表
查看>>
【JAVA数据结构】先进先出队列
查看>>
String类的intern方法随笔
查看>>
【泛型】一个简易的对象间转换的工具类(DO转VO)
查看>>
1.随机函数,计算机运行的基石
查看>>
MouseEvent的e.stageX是Number型,可见as3作者的考虑
查看>>
在mc中直接加aswing组件,该组件还需最后用validate()方法
查看>>
移植Vim配色方案到Eclipse
查看>>
从超链接调用ActionScript
查看>>
谈谈加密和混淆吧[转]
查看>>
TCP的几个状态对于我们分析所起的作用SYN, FIN, ACK, PSH,
查看>>
网络游戏客户端的日志输出
查看>>
关于按钮的mouseOver和rollOver
查看>>
《多线程服务器的适用场合》例释与答疑
查看>>
Netty框架
查看>>