场景
在一个屏幕中,我有 2 个管理器:1)顶部的菜单管理器和 2)具有信息/按钮元素的正文管理器。菜单管理器进行自定义绘图,以便其菜单元素(LabelFields)的间距适当。
核心问题 - 管理器和子字段绘制顺序
屏幕绘制良好,除非用户执行操作(单击按钮)导致添加/删除带有主体管理器的元素。一旦从正文中添加/删除字段元素,绘制菜单的顺序就会混淆。
当主体管理器添加或删除一个字段时,菜单管理器不是先绘制自身再绘制其子元素(标签字段),而是菜单管理器开始绘制其子元素,然后再绘制自身;因此在标签字段的顶部进行绘画,使它们看起来像是消失了。
评论
已经尝试过 invalidate 和其他选项——在从正文中添加/删除字段元素后,我尝试调用 invalidate、invalidateall、updateDisplay...。都没有成功。
删除自定义子布局有效——我可以解决此问题的唯一方法是删除菜单管理器自定义子布局逻辑。不幸的是,菜单系统以传统方式绘制并且没有提供足够的间距。
下面是菜单管理器的子布局代码,我在这里遗漏了什么吗?
public void sublayout(int iWidth, int iHeight)
{
final int iNumFields = getFieldCount();
int maxHeight = 0;
final int segmentWidth = iWidth / iNumFields;
final int segmentWidthHalf = segmentWidth / 2;
for (int i = 0; i < iNumFields; i++)
{
final Item currentField = (Item)this.getField(i);
// 1. Use index to compute bounds of the field
final int xSegmentTrueCenter = segmentWidth * i + segmentWidthHalf;
// 2. center field inbetween bounds using field width (find fill width of text)
final int xFieldStart = xSegmentTrueCenter - currentField.getFont().getAdvance(currentField.getText())/2;
// set up position
setPositionChild(currentField, xFieldStart, getContentTop() + MenuAbstract.PADDING_VERTICAL);
// allow child to draw itself
layoutChild(currentField, iWidth, currentField.getHeight());
// compute max height of the field
//int fieldheight = currentField.getHeight();
maxHeight = currentField.getHeight() > maxHeight
? currentField.getHeight() + 2 * MenuAbstract.PADDING_VERTICAL
: maxHeight;
}
this.setExtent(iWidth, maxHeight);
}
最后的问题
最终我想保留菜单管理器的自定义布局,同时允许重绘字段元素。这是我最后的问题:
你以前有过这种经历吗?
当向屏幕添加/删除字段元素时,为什么菜单管理器会以错误的顺序开始绘制?
本机 Manager.sublayout() 是否会做一些我不会维护绘图顺序的事情?