昨天測試提看一個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("\r", "").split("\n"); 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("\n"); lineWidth = 0; --cnt; } } } sbNewText.append("\n"); } //把結尾多余的\n去掉 if (!rawText.endsWith("\n")) { sbNewText.deleteCharAt(sbNewText.length() - 1); } return sbNewText.toString(); }
加載完調用:

tvDes.setText(desc.getSurvey_conclusion());
tvDes.setText(autoSplitText(tvDes));
如果出現不正常的問題,再換種方式調用,:

ViewTreeObserver observer = tvDes.getViewTreeObserver(); observer.addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { tvDes.setText(autoSplitText(tvDes)); } });
就可以了。