После изменения свойства объекта LayoutParams мне нужно снова вызвать setLayoutParams?
У меня есть вид (содержащий объявление), который мне нужно масштабировать, чтобы соответствовать ширине экрана в определенный момент времени (после загрузки объявления). Поэтому у меня есть метод setHeight(myView)
, который вычисляет правильную высоту для данной ширины экрана и соответственно изменяет LayoutParams View. Важнейшая часть кода такова:
LayoutParams params = myView.getLayoutParams();
int width = myView.getWidth();
if (params != null && width > 0) {
params.height = (int) Math.round(ratio * width);
}
Похоже, что это работает по большей части, но иногда представление не масштабируется. Кажется, что он работает только последовательно, если я добавлю следующую строку внизу:
myView.setLayoutParams(params);
Это тоже имеет смысл, поскольку Android Views вызывает requestLayout()
в своем методе setLayoutParams()
. И наоборот, я не вижу, как изменение в публичном поле (params.height
) приведет к изменению макета.
С другой стороны, я неоднократно нахожу учебные пособия в сети, где параметры просто меняются, а затем снова не отображаются в представлении.
Итак, мой вопрос: правильно ли, чтобы сразу обновить макет после изменения свойства LayoutParams, мне нужно снова вызвать setLayoutParams
? И что простое изменение свойства приведет только к изменению макета в какой-то более поздний момент времени, когда изменение макета запускается из другого места?
Ответы
Ответ 1
Изменение параметров макета только вступает в силу при следующем проходе макета.
-
requestLayout()
расписание макета
-
setLayoutParams()
вызывает requestLayout()
, как вы заметили
-
Иногда прокладка макета назначается другими средствами. Например, сразу после инфляции параметры макета также были завышены, и сообщение измерения/макета только что было отправлено в очередь сообщений потока пользовательского интерфейса для последующей обработки.
Итак, чтобы быть в безопасности, вызовите requestLayout()
всегда после касания параметров макета. setLayoutParams()
работает тоже, хотя это не является строго необходимым при изменении параметров на месте.