TextView设置文字包含中英文时自动换行问题的终极解决方案

简介: 解决android textview自动换行问题

解决android textview自动换行问题


情景,正常TextView中设置文本内容中包含中英文时会造成自动换行的问题,影响界面显示效果,如图:

20210603141952531.png

最终是要如下代码完美解决,效果图如下:

20210603142022131.png

具体实现过程 以及代码

public class SDAdaptiveTextView extends TextView {
    public SDAdaptiveTextView(Context context) {
        super(context);
    }
    public SDAdaptiveTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }
    public SDAdaptiveTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    /**
     * 使用该方法设置TextView的文本内容,改方法不能再主线程中执行
     * @param text
     */
    public void setAdaptiveText(String text) {
        this.setText(text);
        this.setText(adaptiveText(this));
    }
    private String adaptiveText(final TextView textView) {
        final String originalText = textView.getText().toString(); //原始文本
        final Paint tvPaint = textView.getPaint();//获取TextView的Paint
        final float tvWidth = textView.getWidth() - textView.getPaddingLeft() - textView.getPaddingRight(); //TextView的可用宽度
        //将原始文本按行拆分
        String[] originalTextLines = originalText.replaceAll("\r", "").split("\n");
        StringBuilder newTextBuilder = new StringBuilder();
        for (String originalTextLine : originalTextLines) {
            //文本内容小于TextView宽度,即不换行,不作处理
            if (tvPaint.measureText(originalTextLine) <= tvWidth) {
                newTextBuilder.append(originalTextLine);
            } else {
                //如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行
                float lineWidth = 0;
                for (int i = 0; i != originalTextLine.length(); ++i) {
                    char charAt = originalTextLine.charAt(i);
                    lineWidth += tvPaint.measureText(String.valueOf(charAt));
                    if (lineWidth <= tvWidth) {
                        newTextBuilder.append(charAt);
                    } else {
                        //单行超过TextView可用宽度,换行
                        newTextBuilder.append("\n");
                        lineWidth = 0;
                        --i;//该代码作用是将本轮循环回滚,在新的一行重新循环判断该字符
                    }
                }
            }
        }
        return newTextBuilder.toString();
    }
}

使用 setAdaptiveText 方法替代 原生的 setText 方法,注意该方法不能再主线程中执行

如果TextView宽度设置为WrapContent,为了测量它的准确宽度,可先使用setText()方法设值,再调用setAdaptiveText()设值

举例使用:

        tvSdAdaptive.post(new Runnable() {
            @Override
            public void run() {
                tvSdAdaptive.setAdaptiveText("");
            }
        });
        tvSdAdaptive.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                tvSdAdaptive.setAdaptiveText("");
                tvSdAdaptive.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
        });
相关文章
|
安全 Java Android开发
安卓开发中的新趋势:Kotlin与Jetpack的完美结合
【6月更文挑战第20天】在不断进化的移动应用开发领域,Android平台以其开放性和灵活性赢得了全球开发者的青睐。然而,随着技术的迭代,传统Java语言在Android开发中逐渐显露出局限性。Kotlin,一种现代的静态类型编程语言,以其简洁、安全和高效的特性成为了Android开发中的新宠。同时,Jetpack作为一套支持库、工具和指南,旨在帮助开发者更快地打造优秀的Android应用。本文将探讨Kotlin与Jetpack如何共同推动Android开发进入一个新的时代,以及这对开发者意味着什么。
190 5
|
XML Android开发 UED
|
XML 前端开发 Java
Android Kotlin/Java 动态设置 shape/drawable 等状态效果
      小菜最近遇到一个小需求,程序里面有个别页面,需要动态的调整某个页面的样式,包括一键变灰等效果。       以前页面是用 shape 和 drawable 之类实现的效果。
3937 0
TextView文本尾部添加标签,支持自动换行
TextView文本尾部添加标签,支持自动换行
|
Android开发
Android 实现布局的缩小和再放大动画(使用scale动画效果进行实现)
Android 实现布局的缩小和再放大动画(使用scale动画效果进行实现)
1125 0
|
IDE 安全 Java
使用 kotlin.Deprecated,优雅废弃你的过时代码
使用 kotlin.Deprecated,优雅废弃你的过时代码
631 0
|
Android开发 UED
完美解决android软键盘挡住输入框方法,还不顶标题栏
完美解决android软键盘挡住输入框方法,还不顶标题栏
1802 0
完美解决android软键盘挡住输入框方法,还不顶标题栏
|
Android开发
Android:解决TextView排版混乱问题
Android:解决TextView排版混乱问题
680 0