void invalidate()
Invalidates the entire screen.
void invalidateLayout()
Invalidates this screen's layout (including all controlled fields).
javadoc没有多大帮助。你能告诉我为什么我们需要invalidateLayout()?
答案 0 :(得分:2)
根据您构建用户界面的方式,当您希望更改显示时,您可能会对无效或更新布局感兴趣。
如果您的用户界面由标准Field
对象组成,例如TextField
,ButtonField
或BrowserField
,而没有太多自定义,那么定义工作方式的工作UI看起来主要是这些字段布局的方式。 布局是指设置字段的大小及其位置。
有时,您将拥有一个需要在较低级别处理的UI。例如,您可以执行一些自定义绘制,包括绘制线条,填充区域,绘制渐变等。此工作通常在Field
对象的paint()
方法中完成。有时,您还可以在drawFocus()
或paintBackground()
等其他位置使用绘图代码。
如果您想触发重新绘制,这会调用您的自定义paint()
方法,那么您希望使用invalidate()
来实现这一点。
如果您想触发一个新布局,用于排列具有特定大小或位置的子字段,则可以使用invalidateLayout()
。
但是,我会注意到invalidateLayout()
是Screen
类中的一种方法。如果您使用RIM Screen
子类,例如MainScreen
或FullScreen
,那么它们会带有自己的顶级委托 Manager
对象。我相信调用Screen.invalidateLayout()
会触发要调用的内置sublayout()
上的Manager
方法。这可能不是你真正想要的。
除非你像这样实现自己的Screen
子类:
public class MyScreen extends Screen {
public MyScreen() {
super(new MyCustomManager());
}
}
您可能没有自己为该委托经理实施代码(包括sublayout()
)。
我发现当我想强制再次调用sublayout()
时,我会使用updateLayout() method触发,而不是invalidateLayout()
。此外,与invalidateLayout()
相对,Screen
的方法,updateLayout
可用于所有Manager
和Field
类,因此您可以选择要刷新的UI元素树的特定部分。但是,这只是我的经历。