Это то, что я лично делал на своих предыдущих работах, и это также подтверждается многочисленными другими примерами в Интернете (ссылка: Поиск кода SourceGraph).
Однако, попытавшись использовать этот шаблон сегодня, я был шокирован, увидев, что возвращаемое значение View.getWidth() не включает в себя заполнение. Чтобы проиллюстрировать это, я провел два эксперимента:
Эксперимент 1: программно добавленное дополнение
activity_main.xml:
Код: Выделить всё
[*] android:id="@+id/inner"
android:background="#ffffc0cb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" />
Код: Выделить всё
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 идентичны и остаются постоянными.
- вычисление «базовой ширины» уменьшается на величину отступа.
activity_main.xml:
Код: Выделить всё
Код: Выделить всё
findViewById(R.id.texty).let {
it.doOnNextLayout {
Log.i("TAG", "texty.height=${it.height}, texty.paddingTop=${it.paddingTop}")
Log.i("TAG", "texty.width=${it.width}, texty.paddingLeft=${it.paddingLeft}")
}
}
Код: Выделить всё
16:49:57.414 I texty.height=788, texty.paddingTop=0
16:49:57.414 I texty.width=788, texty.paddingLeft=0
Код: Выделить всё
16:50:39.012 I texty.height=788, texty.paddingTop=26
16:50:39.012 I texty.width=788, texty.paddingLeft=26
Подробнее здесь: https://stackoverflow.com/questions/798 ... de-padding
Мобильная версия