Это то, что я лично делал на своих предыдущих работах, и это также подтверждается многочисленными другими примерами в Интернете (ссылка: Поиск кода SourceGraph).
Однако, попытавшись использовать этот шаблон сегодня, я был шокирован, увидев, что возвращаемое значение View.getWidth() не включает в себя заполнение. Чтобы проиллюстрировать это, я провел следующий эксперимент:
Код: Выделить всё
myList.forEach { s ->
val squareItemView = SquareItemView(this)
// irrelevant boilerplate omitted
innerContents.addView(squareItemView)
innerContents.post {
val baseWidth = innerContents.run { width - (paddingLeft + paddingRight) }
Log.i(
"TAG",
"innerContents.measuredWidth=${innerContents.measuredWidth}, " +
"innerContents.width=${innerContents.width}, " +
"baseWidth=${baseWidth}, " +
"innerContents.paddingLeft=${innerContents.paddingLeft}"
)
Log.i("TAG", "will add 10px px on either side")
innerContents.apply { setPadding(paddingLeft + 10, paddingTop, paddingRight + 10, paddingBottom) }
}
}
Код: Выделить всё
23:42:49.923 I innerContents.measuredWidth=693, innerContents.width=693, baseWidth=693, innerContents.paddingLeft=0
23:42:49.923 I will add 10px px on either side
23:42:49.924 I innerContents.measuredWidth=693, innerContents.width=693, baseWidth=673, innerContents.paddingLeft=10
23:42:49.924 I will add 10px px on either side
23:42:49.924 I innerContents.measuredWidth=693, innerContents.width=693, baseWidth=653, innerContents.paddingLeft=20
23:42:49.924 I will add 10px px on either side
- простые числа getMeasuredWidth и getWidth идентичны и остаются постоянными.
- вычисление «базовой ширины» уменьшается на величину заполнения.
Подробнее здесь: https://stackoverflow.com/questions/798 ... de-padding
Мобильная версия