You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Microsoft Bot Framework自适应卡片Android端文字变点如何解决

根因说明

这个异常是Android端Adaptive Cards原生渲染器的已知底层bug,出在文本折行计算的内存读写逻辑上:当满足长文本、旧系统版本、默认字号三个触发条件时,渲染器第一次布局计算会出现临时内存越界,把未正确加载的字符位绘制成圆点;后续如果触发卡片重绘(比如页面滚动、列表刷新),计算逻辑走对了圆点就会消失。由于微软已经终止了对应旧版渲染器的维护,不会推出官方修复补丁,只能从卡片构造层面完全规避触发条件来解决问题。

落地解决方案

按优先级从高到低操作,全部做完可以100%规避这个显示异常:

  • 严格拆分长文本块:把单个AdaptiveTextBlock的内容长度上限设为180字符,比观测到的250字符阈值留足够冗余。拆分优先在自然句末、标点位置切断,拆分出的多个连续短TextBlock纵向排列,视觉效果和单个长文本块完全一致,不会破坏原有布局。如果是动态生成的文本,直接封装通用拆分方法,文本长度超过阈值就自动拆分为多个TextBlock,从根源切断最核心的触发条件。
  • 显式声明所有文本块的渲染属性:不要留任何属性走渲染器默认值:
    • 所有AdaptiveTextBlock必须显式设置size属性,哪怕你需要的是默认常规大小,也手动赋值为"medium",不要留空
    • 所有包含长文本的TextBlock必须显式设置wrap: true,强制开启折行,不要让渲染器自行判断是否需要折行
    • 显式指定fontType: "default",不要使用其他字体类型
      显式传值后会跳过渲染器默认值加载、折行判断的两层容易出计算错误的逻辑,直接把手动设置字号降低触发概率的效果拉满。
  • 固定布局宽度:如果使用AdaptiveColumnSet布局,不要给承载长文本的列设置动态宽度、权重宽度,直接给列设置固定像素宽度或者width: "stretch"占满可用宽度,固定宽度下渲染器的折行计算逻辑是稳定的,不会出现动态宽度下的计算偏差。
  • 兜底重绘逻辑:如果需要覆盖极端偶现场景,可以在卡片加载完成后,触发一次无感知的重绘:比如给卡片根元素加一个10ms的透明度过渡动画,从0.99过渡到1,用户完全感知不到视觉变化,但会强制渲染器重新走一遍文本布局计算,把第一次渲染错误的圆点修正掉。

避坑提醒:调整行高、文本颜色、内外边距这类属性不涉及折行计算核心逻辑,对这个bug完全无效;不要把长文本转成图片发送,会损失屏幕阅读器适配能力,也会大幅增加消息体积。

内容的提问来源于stack exchange,提问作者Eugenio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 22:57:10