首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

Android TextView 固定字符數換行實現:字符串截取與拼裝換行符

     編輯:關於C++

需求背景

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

進階優化建議

  1. 精確字符寬度計算:使用 Paint.measureText() 獲取真實像素寬度,支援任意字體大小。
  2. 處理換行符保留:若原字符串已含 \n,應優先按原換行分段,再對每段處理。
  3. 避免單字符超寬截斷:若單個字符寬度超過 len,需決定是強制換行還是允許溢出。
  4. 性能優化:對於長文本,考慮使用 StaticLayout 或自定義 View 繪製,而非預處理字符串。

總結

通過字符視覺寬度累加插入 \n,可快速實現定寬換行需求。生產環境建議結合 Paint 測量實現像素級精確換行,或直接使用 TextView 的 setEllipsize/setMaxLines 等屬性配合佈局實現自適應。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved