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の構築方法によっては、表示を変更したいときに、レイアウトを無効にしたり、更新したりすることが必要になる場合があります。

、、、、などの標準Fieldオブジェクトで構成され、あまりカスタマイズされていないUIがある場合、UIの外観を定義する作業は、主にそれらのフィールドのレイアウト方法にあります。 レイアウトとは、フィールドのサイズとその位置を設定することです。TextFieldButtonFieldBrowserField

場合によっては、下位レベルで処理する必要があるUIがあります。たとえば、線の描画、領域の塗りつぶし、グラデーションの描画などを含むカスタムペイントを実行できます。この作業は通常、Fieldオブジェクトのpaint()メソッドで実行されます。場合によっては、drawFocus()やなどの他の場所にコードを描画することもありますpaintBackground()

paint()カスタムメソッドを呼び出す再描画をトリガーする場合は、それを使用invalidate()してそれを実現します。

子フィールドを特定のサイズまたは位置に配置する新しいレイアウトをトリガーする場合は、invalidateLayout()そのために使用できます。

ただし、これはクラスinvalidateLayout()のメソッドであることに注意してください。またはのようなScreenRIMScreenサブクラスを使用する場合、それらには独自のトップレベルのデリゲートオブジェクトが付属しています。呼び出すと、そのビルトインのメソッドが呼び出されると思います。それはあなたが本当に望んでいることではないかもしれません。MainScreenFullScreen ManagerScreen.invalidateLayout()sublayout()Manager

Screenこのような独自のサブクラスを実装しない限り、次のようになります。

public class MyScreen extends Screen {

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

おそらくsublayout()、そのデリゲートマネージャーのコード(を含む)を自分で実装していません。

sublayout()強制的に再度呼び出させたい場合は、ではなくupdateLayout()メソッドinvalidateLayout()を使用してトリガーすることがわかりました。また、invalidateLayout()のメソッドであるとは対照的に、ScreenすべてupdateLayoutのクラスで使用できるためManager、更新するUI要素ツリーFieldの特定の部分だけを選択できます。しかし、それは私の経験です。

このトピックに関するBlackBerryフォーラムへのコメントは次のとおりです。

于 2012-12-06T05:59:33.377 に答える