У меня есть вид (содержащий объявление), который мне нужно масштабировать, чтобы соответствовать ширине экрана в определенный момент времени (после загрузки объявления). Поэтому у меня есть метод setHeight(myView)
, который вычисляет правильную высоту для данной ширины экрана и соответственно изменяет LayoutParams View. Решающим часть кода заключается в следующем:После изменения свойства объекта LayoutParams мне нужно снова вызвать setLayoutParams?
LayoutParams params = myView.getLayoutParams();
int width = myView.getWidth();
if (params != null && width > 0) {
params.height = (int) Math.round(ratio * width);
}
Это похоже на работу по большей части, но иногда вид не масштабируется. Это, кажется, только consistenly работать, если добавить следующую строку в нижней части:
myView.setLayoutParams(params);
Это, кажется, имеет смысл, тоже, так как Android Просмотров называют requestLayout()
в их методе setLayoutParams()
. И наоборот, я не вижу, как изменение в публичном поле (params.height
) вызовет изменение макета.
С другой стороны, я неоднократно нахожу учебные пособия в сети, где параметры просто меняются, а затем снова не отображаются в представлении.
Итак, мой вопрос: правильно ли сразу обновить макет после изменения свойства LayoutParams, мне нужно снова позвонить setLayoutParams
? И что простое изменение свойства приведет только к изменению макета в какой-то более поздний момент времени, когда изменение макета запускается из другого места?
Поскольку LayoutParams используются для связи от ребенка к родительскому объекту, не нужно ли нам вызывать requestLayout для родителя после изменения LayoutParams ребенка? – vlazzle
@vlazzle Запросы макета для детей распространяются и на родителя. – laalto
О да, я вижу это [здесь] (https://github.com/android/platform_frameworks_base/blob/master/core/java/android/view/View.java#L21920). Спасибо @laalto! – vlazzle