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

После изменения свойства объекта 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? И что простое изменение свойства приведет только к изменению макета в какой-то более поздний момент времени, когда изменение макета запускается из другого места?

4b9b3361

Ответ 1

Изменение параметров макета только вступает в силу при следующем проходе макета.

  • requestLayout() расписание макета

  • setLayoutParams() вызывает requestLayout(), как вы заметили

  • Иногда прокладка макета назначается другими средствами. Например, сразу после инфляции параметры макета также были завышены, и сообщение измерения/макета только что было отправлено в очередь сообщений потока пользовательского интерфейса для последующей обработки.

Итак, чтобы быть в безопасности, вызовите requestLayout() всегда после касания параметров макета. setLayoutParams() работает тоже, хотя это не является строго необходимым при изменении параметров на месте.