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
相关产品推荐
相关产品推荐

