2
void invalidate() 
      Invalidates the entire screen.


void invalidateLayout() 
      Invalidates this screen's layout (including all controlled fields).

javadoc 没有多大帮助。你能告诉我为什么我们需要invalidateLayout()吗?

4

1 回答 1

2

根据您构建 UI 的方式,当您希望更改显示时,您可能对无效更新布局感兴趣。

如果您的 UI 由标准Field对象(如TextField、 或ButtonField、 or )组成BrowserField,没有太多自定义,那么定义 UI 外观的工作主要在于这些字段的布局方式。 布局是指设置字段的大小及其位置。

有时,您会有一个需要在较低级别进行处理的 UI。例如,您可能会做一些自定义绘画,其中涉及绘制线条、填充区域、绘制渐变等。这项工作通常以Field对象的paint()方法完成。有时,您在其他地方也有绘图代码,例如drawFocus()or paintBackground()

如果你想触发重绘,它调用你的自定义paint()方法,那么你想用invalidate()它来实现。

如果你想触发一个新的布局,它以特定的大小或位置排列子字段,那么invalidateLayout()可以用于那个。

但是,我会注意到这invalidateLayout()Screen类中的一个方法。如果您使用 RIMScreen子类,例如MainScreenor FullScreen,那么它们带有自己的顶级委托 Manager对象。我相信调用Screen.invalidateLayout()将触发该sublayout()内置的方法Manager被调用。那可能不是你真正想要的。

除非您像这样实现自己的Screen子类:

public class MyScreen extends Screen {

   public MyScreen() {
       super(new MyCustomManager());
   }
}

您可能没有sublayout()自己实现该委托管理器的代码(包括 )。

我发现当我想强制sublayout()再次被调用时,我使用updateLayout() 方法触发它,而不是invalidateLayout(). 此外,与 的方法相反,invalidateLayout()它适用于所有类和类,因此您可以只选择要刷新的 UI 元素树的特定部分。但是,这只是我的经验。ScreenupdateLayoutManagerField

以下是 BlackBerry 论坛上有关此主题的一些评论

于 2012-12-06T05:59:33.377 回答