• Android中 TextView 加载 混合字符 自动换行解决方案


    昨天测试提看一个bug,如下:

    【3.1.0】当实勘员点评由中文和数字组成时,第一个中文后会自动换行 

    最终解决办法为加入这个方法:

     private String autoSplitText(final TextView tv) {
            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("
    ", "").split("
    ");
            StringBuilder sbNewText = new StringBuilder();
            for (String rawTextLine : rawTextLines) {
                if (tvPaint.measureText(rawTextLine) <= tvWidth) {
                    //如果整行宽度在控件可用宽度之内,就不处理了
                    sbNewText.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) {
                            sbNewText.append(ch);
                        } else {
                            sbNewText.append("
    ");
                            lineWidth = 0;
                            --cnt;
                        }
                    }
                }
                sbNewText.append("
    ");
            }
    
            //把结尾多余的
    去掉
            if (!rawText.endsWith("
    ")) {
                sbNewText.deleteCharAt(sbNewText.length() - 1);
            }
    
            return sbNewText.toString();
        }
    View Code

    加载完调用:

       tvDes.setText(desc.getSurvey_conclusion());
            tvDes.setText(autoSplitText(tvDes));
    View Code

    如果出现不正常的问题,再换种方式调用,:

       ViewTreeObserver observer = tvDes.getViewTreeObserver();
            observer.addOnGlobalLayoutListener(
                    new ViewTreeObserver.OnGlobalLayoutListener() {
                        @Override
                        public void onGlobalLayout() {
                            tvDes.setText(autoSplitText(tvDes));
                        }
                    });
    View Code

    就可以了。

  • 相关阅读:
    Delphi实现文件关联
    用Delphi实现文件关联
    Delphi 7使用自定义图标关联文件类型
    redux-form的学习笔记
    妙用 `package.json` 快速 `import` 文件(夹)
    【webpack2】-- 入门与解析
    黑科技:CSS定制多行省略
    DOM操作和样式操作库的封装
    webstorm 2016 激活破解
    js/jq仿window文件夹框选操作插件
  • 原文地址:https://www.cnblogs.com/itpepe/p/5732685.html
Copyright © 2020-2023  润新知