HarmonyOS鸿蒙Next中text组件在5.1系统中显示问题

HarmonyOS鸿蒙Next中text组件在5.1系统中显示问题

【问题描述】:text组件在鸿蒙5.1系统中,设置最大3行超出三行使用省略号, 如果第三行正好是 换行符 “\n” 第四行是正常文字, 这时候省略号不显示,在6.1系统是正常的

【问题现象】:用5.1.0的模拟器也是有省略号的,

复现代码

Text(this.content) 
  .fontSize(16)
  .textAlign(TextAlign.Start)
  .fontColor($r('app.color.common_title_txt'))
  .fontFamily('FZBiaoYaSong-GBK_YS')
  .width('100%')
  .textOverflow({ overflow: TextOverflow.Ellipsis })
  .fontWeight(650)
  .lineSpacing(LengthMetrics.px(30))
  .maxLines(3)直接这样 5.1系统的真机不显示省略号

cke_3204.png


更多关于HarmonyOS鸿蒙Next中text组件在5.1系统中显示问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

11 回复

尊敬的开发者,您好,
感谢您提供本次报障的线索及定位协助。

当前该问题只能升级处理,因为发现bug会在后续版本修复解决,无法在已发布的版本解决先前版本存在的bug。
由于HarmonyOS现在升级基本都是进行全量升级的,建议您升级系统版本解决该问题。

更多关于HarmonyOS鸿蒙Next中text组件在5.1系统中显示问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


TextArea有这个bug吗?

尊敬的开发者,您好,
该问题现象已经在6.1版本修复,您可以升级至对应版本规避该问题。
如果您的应用确实需要兼容5.1系统版本,请您描述下具体的应用场景是什么样的?

很多都是这种格式的

显示效果不错的

尊敬的开发者,您好,
关于您反馈的问题,
这边建议您升级到6.1版本,如果您的应用需要兼容5.1系统,您可以采用预处理文本的方式,去除末尾多余换行符。
在数据源头处理,将文本中连续的换行符替换为单个换行符,或将maxLines行之后的换行符移除,确保系统不会因换行符的行数计算产生误判:

@Entry
@Component
struct TextEllipsisFixPage {
  @State content: string = '第一行内容\n第二行内容\n\n第四行内容';

  // 预处理文本:去除连续换行符,确保换行符后无空行
  private processText(text: string): string {
    // 将连续多个换行符替换为单个换行符
    let processed = text.replace(/\n{2,}/g, '\n');
    return processed;
  }

  build() {
    Column() {
      // 处理后的文本
      Text(this.processText(this.content))
        .fontSize(16)
        .textAlign(TextAlign.Start)
        .fontColor($r('app.color.common_title_txt'))
        .fontFamily('FZBiaoYaSong-GBK_YS')
        .width('100%')
        .textOverflow({ overflow: TextOverflow.Ellipsis })
        .fontWeight(650)
        .lineSpacing(LengthMetrics.px(30))
        .maxLines(3)
    }
  }
}

假如,我第一行有文字,第二行和第三行是换行符,第四行是文字,这样用的话就成了一个换行符了,相当于我的四行变成了3行了

这个好像是5.1系统的已知得行为差异,6.1系统已修正。如果你的应用需要兼容5.1系统。我建议你可以采用预处理文本的方式,去除末尾多余换行符。

在数据源头处理,将文本中连续的换行符替换为单个换行符,或将maxLines行之后的换行符移除,确保系统不会因换行符的行数计算产生误判,类似下面这样:

@Entry
@Component
struct TextEllipsisFixPage {
  @State content: string = '第一行内容\n第二行内容\n\n第四行内容';

  // 预处理文本:去除连续换行符,确保换行符后无空行
  private processText(text: string, maxLines: number): string {
    // 方式1:将连续多个换行符替换为单个换行符
    let processed = text.replace(/\n{2,}/g, '\n');
    return processed;
  }

  build() {
    Column() {
      // 处理后的文本
      Text(this.processText(this.content, 3))
        .fontSize(16)
        .textAlign(TextAlign.Start)
        .fontColor($r('app.color.common_title_txt'))
        .fontFamily('FZBiaoYaSong-GBK_YS')
        .width('100%')
        .textOverflow({ overflow: TextOverflow.Ellipsis })
        .fontWeight(650)
        .lineSpacing(LengthMetrics.px(30))
        .maxLines(3)
    }
  }
}

这个现象更像是 5.1 真机文本排版在“最后可见行刚好是换行符”时的省略号边界问题。既然 5.1 模拟器和 6.1 真机表现不同,建议先按兼容问题处理,不要只改字体或 lineSpacing。

可用几个规避方案:1. 渲染前把连续换行或末尾换行做规范化,避免第 3 行只落一个 \n;2. 对可能截断的文本用 measureTextSize 计算完整高度和 maxLines 高度,确认被截断时自行展示一个尾部提示;3. 尝试固定 lineHeight,减少 lineSpacing 与字体度量差异;4. 保留最小复现,带真机系统版本和字体资源反馈组件差异。

在HarmonyOS 5.1系统中,Text组件显示异常通常与基线对齐或字体渲染引擎变更有关。请检查是否设置了lineHeighttextOverflowmaxLines属性;对于多语言文本,需确认textAligndirection配置正确。若使用自定义字体,确保字体文件适配新系统的字体处理机制。调整renderFit属性(如RenderFit.SCALE_DOWN)可缓解部分布局溢出问题。,

该问题是 HarmonyOS 5.1 系统 Text 组件的一个已知渲染差异。当 maxLines 恰好卡在换行符 \n 处,后续行还有内容时,省略号逻辑未正确触发,导致省略号丢失。5.1.0 模拟器及 6.1 真机均已修复。
临时规避方案:

  1. 在设置文本前,用 replace(/\n+$/, '') 去除末尾多余的换行符。
  2. 若必须保留换行结构,可在文本末尾追加零宽空格 \u200B,强制触发截断检测。
    该缺陷属于系统渲染层面的边界处理问题,升级系统版本即可彻底解决。
回到顶部