程式碼中 setText("aaaa\nbbb\nccc") 可正確換行,但若字串來源為資源檔、網路回傳、JSON 解析,\n 可能以字面反斜線+n 形式存在(即 "aaaa\\nbbb"),需轉換處理。
textView.setText("第一行\n第二行\n第三行");
// 顯示:
// 第一行
// 第二行
// 第三行
// 來源:strings.xml、API 回傳、設定檔
String raw = "第一行\\n第二行\\n第三行"; // 實際字元:反斜線 + n
textView.setText(raw); // 顯示:第一行\n第二行\n第三行 ❌
// 方法一:replace
String processed = raw.replace("\\n", "\n");
textView.setText(processed);
// 方法二:StringEscapeUtils (Apache Commons Text)
String processed = StringEscapeUtils.unescapeJava(raw);
textView.setText(processed);
// 方法三:正則(處理 \r\n, \n, \r 統一)
String processed = raw.replaceAll("(?
第一行
第二行
第三行
第一行\n第二行\n第三行
// 程式碼讀取
String fromXml = getString(R.string.multi_line_text); // 自動解析換行
textView.setText(fromXml); // 正確換行
String html = "第一行
第二行
第三行";
textView.setText(Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY));
// 或 API 24+
textView.setText(Html.fromHtml(html, Html.FROM_HTML_MODE_COMPACT));
TextView tv = findViewById(R.id.textView);
tv.setText("第一行\n第二行\n第三行");
tv.setMaxLines(3); // 限制最大行數
tv.setEllipsize(TextUtils.TruncateAt.END); // 超出顯示 ...
tv.setLineSpacing(0, 1.2f); // 行距倍率 1.2
tv.setGravity(Gravity.START | Gravity.TOP); // 對齊
Java 字串常值中的
\n是單一換行字元;外部來源的\\n是兩個字元,需轉換後再 setText。
理解字串來源與轉義差異,即可正確控制 TextView 多行顯示。