昨天測試提看一個bug,以下:app
【3.1.0】當實勘員點評由中文和數字組成時,第一個中文後會自動換行 ide
最終解決辦法爲加入這個方法:測試
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));
若是出現不正常的問題,再換種方式調用,:ui
ViewTreeObserver observer = tvDes.getViewTreeObserver(); observer.addOnGlobalLayoutListener( new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { tvDes.setText(autoSplitText(tvDes)); } });
就能夠了。spa