Screen.invalidate()和Screen.invalidateLayout()之间的区别是什么

时间:2012-12-06 01:55:49

标签: blackberry blackberry-jde

void invalidate() 
      Invalidates the entire screen.


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

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

1 个答案:

答案 0 :(得分:2)

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

如果您的用户界面由标准Field对象组成,例如TextFieldButtonFieldBrowserField,而没有太多自定义,那么定义工作方式的工作UI看起来主要是这些字段布局的方式。 布局是指设置字段的大小及其位置。

有时,您将拥有一个需要在较低级别处理的UI。例如,您可以执行一些自定义绘制,包括绘制线条,填充区域,绘制渐变等。此工作通常在Field对象的paint()方法中完成。有时,您还可以在drawFocus()paintBackground()等其他位置使用绘图代码。

如果您想触发重新绘制,这会调用您的自定义paint()方法,那么您希望使用invalidate()来实现这一点。

如果您想触发一个新布局,用于排列具有特定大小或位置的子字段,则可以使用invalidateLayout()

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

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

public class MyScreen extends Screen {

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

您可能没有自己为该委托经理实施代码(包括sublayout())。

我发现当我想强制再次调用sublayout()时,我会使用updateLayout() method触发,而不是invalidateLayout()。此外,与invalidateLayout()相对,Screen的方法,updateLayout可用于所有ManagerField类,因此您可以选择要刷新的UI元素的特定部分。但是,这只是我的经历。

Here's some comments on the BlackBerry forums on this topic