Подтвердить что ты не робот

Что вызывает вызов вида() для вызова

В моем приложении у меня есть бесконечный цикл в одном из моих переопределений View onMeasure(). Отлаживая исходный код, начиная с точки останова в моем onMeasure, я могу проследить весь путь до трассировки стека до меры PhoneWindow $DecorView() (самый верхний класс в моей иерархии представлений), который вызывается ViewRoot.performTraversals(). Теперь отсюда, если я продолжу переходить, я в конечном итоге получаю метод PhoneWindow $DecorView(), вызванный снова сообщением в классе Looper.loop(). Я угадываю, что что-то поставило в очередь сообщение, которое нужно переделать, например, недействительным.

Мой вопрос в том, что вызывает срабатывание вызова измерения в представлении?

Из моего понимания процесса компоновки/измерения/рисования это будет происходить только тогда, когда метод invalidate() вызывается в определенном представлении, и это будет просачиваться вниз и выполнить проход макета/меры/рисования для этого представления, недействительным и всех его детей. Я бы предположил, что каким-то образом мой самый верхний вид в моей иерархии просмотров становится недействительным.

Однако я явно поставил точку останова на каждый отдельный вызов invalidate, который у меня есть, и я не называю invalidate каким-то бесконечным образом. Поэтому я не думаю, что это так. Есть ли другой способ инициировать передачу меры? Может ли что-то внутренне инициировать это? Я немного из идей, увидев, что ничто не является беспринципным.

4b9b3361

Ответ 1

Чтобы инициировать передачу меры для пользовательского представления, вы должны вызвать метод requestLayout(). Например, если вы реализуете пользовательское представление, которое расширяет представление и оно будет вести себя как TextView, вы можете написать метод setText следующим образом:

/**
 * Sets the string value of the view.
 * @param text the string to write
 */
public void setText(String text) {
    this.text = text;

            //calculates the new text width
    textWidth = mTextPaint.measureText(text);

    //force re-calculating the layout dimension and the redraw of the view
    requestLayout();
    invalidate();
}

Ответ 2

Ну, если вы меняете контент "Просмотр", в конечном итоге ему придется вызвать invalidate(). Например, у вас есть TextView с текстом под названием "Текст 1". Теперь вы меняете текст того же TextView на "Text 2". Здесь также будет вызываться invalidate.

Итак, в основном, когда что-то меняется в представлении, чаще всего, вы ожидаете вызова метода invalidate и соответствующего вызова меры().

Посмотрите, например, на исходный код TextView. http://www.google.com/codesearch#uX1GffpyOZk/core/java/android/widget/TextView.java&q=TextView%20package:android&type=cs

Подсчитайте количество недействительных вызовов. Их довольно много.