Включает ли View.getHeight/getWidth заполнение?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Включает ли View.getHeight/getWidth заполнение?

Сообщение Anonymous »

У меня сложилось впечатление, что значение, возвращаемое View.getWidth(), включает в себя заполнение. Я не думаю, что у меня галлюцинации: обычная строка кода, которую пишут разработчики Android, — это что-то вроде myView.run { width - (paddingLeft + paddingRight) , цель которого — получить ширину представления без отступов (так сказать, «базовую ширину»).
Это то, что я лично делал на своих предыдущих работах, и это также подтверждается многочисленными другими примерами в Интернете (ссылка: Поиск кода 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" />

MainActivity.kt:

Код: Выделить всё

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
Обратите внимание, что в этой демонстрации каждый раз, когда мы добавляем 10 пикселей отступа слева и справа:
  • простые числа getMeasuredWidth и getWidth идентичны и остаются постоянными.
  • вычисление «базовой ширины» уменьшается на величину отступа.
Эксперимент 2: жестко запрограммированное отступ. (меньше переменных, о которых нужно думать)
activity_main.xml: MainActivity.kt:

Код: Выделить всё

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
Вывод журнала, когда для заполнения установлено значение 10dp:

Код: Выделить всё

16:50:39.012  I  texty.height=788, texty.paddingTop=26
16:50:39.012  I  texty.width=788, texty.paddingLeft=26
Этот результат противоречит тому, что мы ожидаем увидеть. Как я уже сказал, я не помню, чтобы такое было несколько месяцев (недель?) назад, но, видимо, это так. Изменил ли Google это поведение на уровне библиотеки или даже на уровне ОС? Что происходит? :(

Подробнее здесь: https://stackoverflow.com/questions/798 ... de-padding
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»