如果我有一个带有2个文本区域的CustomContainer,是否可以在运行时更新这些文本区域的文本?请注意,自定义容器在滚动列表中。
是的,这是可能的。也许这个迟来的答案可以帮助别人。
我有一个屏幕,上面列出了实际故障的自定义小部件。自定义容器有4个文本区域:日期、时间、错误组件、错误文本。在这里,我用三种方式设置文本,日期和时间的文本是由时间数值生成的,标题的文本是从资源中读取的,错误详细信息文本的文本是在资源中读取,但随后会填充值。
屏幕上的内容通过滚动或调用invalidate无效后,将从touchgfx运行时自动调用回调函数xxxUpdateItem。您必须在屏幕的视图类中重写并实现它。调用此函数时引用您的自定义小部件和当前项目的实际索引,如下所示:
void MessageScreenView::scrollList1UpdateItem(CustomContainerFailureOrInfo& item, int16_t itemIndex)
由此,您可以调用自定义小部件的一个功能,该功能设置新文本,例如:
void CustomContainerFailureOrInfo::setDetails(uint16_t itemIdx, uint32_t dateTime, uint16_t captionTextId, uint16_t detailTextId, const char16_t * templateF1, float f1, const char16_t * templateF2, float f2)
{
setDateTime(dateTime);
setCaption(captionTextId);
setDetailText(detailTextId, templateF1, f1, templateF2, f2);
}
日期和时间的文本由time_t值生成。使用文本小部件的setTypedText函数从资源中读取标题,例如:
void CustomContainerFailureOrInfo::setCaption(TypedTextId t)
{
caption.setTypedText(TypedText(t));
caption.setWideTextAction(WIDE_TEXT_WORDWRAP);
caption.invalidate();
}
我遇到了一个问题,一些错误消息应该显示与错误相关的值,而另一些则应该只显示plein文本。我通过使用值通配符并传递一个格式字符串和一个值来解决这个问题:
void CustomContainerFailureOrInfo::setDetailText(TypedTextId t, const char16_t * templateF1, float f1, const char16_t * templateF2, float f2)
{
text.setTypedText(TypedText(t));
Unicode::snprintf(textBuffer1, TEXTBUFFER1_SIZE, "");
if (templateF1)
{
if (awiStrUtil::isPrintfFloatContained16(templateF1))
{
Unicode::snprintfFloat(textBuffer1, TEXTBUFFER1_SIZE, reinterpret_cast<const Unicode::UnicodeChar *> (templateF1), f1);
}
else
{
// attention: (const char16_t*)
Unicode::snprintf(textBuffer1, TEXTBUFFER1_SIZE, reinterpret_cast<const Unicode::UnicodeChar *> (templateF1));
}
}
// similar code removed: if (templateF2) ...
text.setWideTextAction(WIDE_TEXT_WORDWRAP);
text.invalidate();
}