В чем разница между Screen.invalidate() и Screen.invalidateLayout()

void invalidate() 
      Invalidates the entire screen.


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

Джавадок мало помогает. Не могли бы вы сказать мне, зачем нам недействительный макет ()?


person draw    schedule 06.12.2012    source источник


Ответы (1)


В зависимости от того, как вы строите свой пользовательский интерфейс, вам может понадобиться аннулировать или обновить макет, когда вы хотите изменить отображение.

Если у вас есть пользовательский интерфейс, состоящий из стандартных объектов Field, таких как TextField, или ButtonField, или BrowserField, без особой настройки, то работа по определению того, как выглядит пользовательский интерфейс, в основном заключается в том, как эти поля расположены размещены. . Макет относится к настройке размера полей и их положения.

Иногда у вас будет пользовательский интерфейс, в котором вам нужно иметь дело на более низком уровне. Например, вы можете выполнить некое пользовательское рисование, которое включает в себя рисование линий, заливки областей, рисование градиентов и т. д. Эта работа обычно выполняется в методе paint() объекта Field. Иногда у вас также есть код рисования в других местах, таких как drawFocus() или paintBackground().

Если вы хотите инициировать перерисовку, которая вызывает ваш пользовательский метод paint(), то вы хотите использовать invalidate(), чтобы это произошло.

Если вы хотите запустить новый макет, который упорядочивает дочерние поля с определенными размерами или позициями, то для этого можно использовать invalidateLayout().

Однако отмечу, что invalidateLayout() — это метод класса Screen. Если вы используете подкласс Screen RIM, например MainScreen или FullScreen, то они поставляются со своими собственными объектами делегата Manager верхнего уровня. Я считаю, что вызов Screen.invalidateLayout() приведет к вызову метода sublayout() для этого встроенного Manager. Это может быть не то, чего вы действительно хотите.

Если вы не реализуете свой собственный подкласс Screen следующим образом:

public class MyScreen extends Screen {

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

вы, вероятно, не реализуете код (включая sublayout()) для этого менеджера делегатов самостоятельно.

Я обнаружил, что когда я хочу снова вызвать sublayout(), я запускаю это с помощью метод updateLayout(), а не invalidateLayout(). Кроме того, в отличие от invalidateLayout(), который является методом Screen, updateLayout доступен для всех классов Manager и Field, поэтому вы можете выбрать только определенную часть дерева элемента пользовательского интерфейса, которую хотите обновить. . Но, это только мой опыт.

Вот несколько комментариев на форумах BlackBerry. по этой теме

person Nate    schedule 06.12.2012