TextView 僅能顯示 10 個英文字符(或等寬字符),超出部分需自動換行。默認 TextView 僅支持按寬度換行或識別 \n 換行符。若字符串本身無換行符,需自行按字符數截取並插入換行符。
考慮中英文混排:英文/數字佔 1 字節,漢字佔 2 字節(UTF-8 下通常 3 字節,此處按 GBK/雙字節邏輯處理)。累加字符「視覺寬度」,達到限制即換行。
/**
* 將字符串按指定視覺長度截取並插入換行符
* @param str 原字符串
* @param len 每行最大視覺長度(英文=1,中文=2)
* @return 帶換行符的新字符串
*/
private String toMultiLine(String str, int len) {
char[] chs = str.toCharArray();
StringBuffer sb = new StringBuffer();
int sum = 0;
for (int i = 0; i < chs.length; i++) {
// 簡易判斷:ASCII 視為 1,其餘視為 2
sum += (chs[i] < 0xFF) ? 1 : 2;
sb.append(chs[i]);
if (sum >= len) {
sum = 0;
sb.append("\n");
}
}
return sb.toString();
}
String test = "abcdefg12345678";
TextView textView = findViewById(R.id.tv_test);
textView.setText(toMultiLine(test, 3)); // 每行 3 個英文字符寬度
abc
def
g12
345
678
Paint.measureText() 獲取真實像素寬度,支援任意字體大小。\n,應優先按原換行分段,再對每段處理。len,需決定是強制換行還是允許溢出。StaticLayout 或自定義 View 繪製,而非預處理字符串。通過字符視覺寬度累加插入 \n,可快速實現定寬換行需求。生產環境建議結合 Paint 測量實現像素級精確換行,或直接使用 TextView 的 setEllipsize/setMaxLines 等屬性配合佈局實現自適應。