2014-10-16 6 views
20

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

ответ

30

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

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

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

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

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

+0

Поскольку LayoutParams используются для связи от ребенка к родительскому объекту, не нужно ли нам вызывать requestLayout для родителя после изменения LayoutParams ребенка? – vlazzle

+1

@vlazzle Запросы макета для детей распространяются и на родителя. – laalto

+0

О да, я вижу это [здесь] (https://github.com/android/platform_frameworks_base/blob/master/core/java/android/view/View.java#L21920). Спасибо @laalto! – vlazzle

Смежные вопросы