К моему удивлению, Snackbar изначально устанавливает дополнительные отступы в TextView, если он занимает несколько строк. Это эффективно удваивает высоту Snackbar, и по какой-то причине влияет только на вертикальное заполнение. Я нашел это в SnackbarContentLayout.onMeasure
:
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (mMaxWidth > 0 && getMeasuredWidth() > mMaxWidth) {
widthMeasureSpec = MeasureSpec.makeMeasureSpec(mMaxWidth, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
final int multiLineVPadding = getResources().getDimensionPixelSize(
R.dimen.design_snackbar_padding_vertical_2lines);
final int singleLineVPadding = getResources().getDimensionPixelSize(
R.dimen.design_snackbar_padding_vertical);
final boolean isMultiLine = mMessageView.getLayout().getLineCount() > 1;
boolean remeasure = false;
if (isMultiLine && mMaxInlineActionWidth > 0
&& mActionView.getMeasuredWidth() > mMaxInlineActionWidth) {
if (updateViewsWithinLayout(VERTICAL, multiLineVPadding,
multiLineVPadding - singleLineVPadding)) {
remeasure = true;
}
} else {
final int messagePadding = isMultiLine ? multiLineVPadding : singleLineVPadding;
if (updateViewsWithinLayout(HORIZONTAL, messagePadding, messagePadding)) {
remeasure = true;
}
}
if (remeasure) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
Почему Snackbar делает это? Почему это не упоминается вообще в документации? Более того, кажется, что это нельзя переопределить даже после аннулирования представлений и запроса макета. Есть ли способ обойти это без создания собственного представления?
РЕДАКТИРОВАТЬ: Оглядываясь назад на документы по дизайну материалов для Snackbar, есть примеры многослойных снеков без дополнительной вертикальной подкладки, к чему я стремлюсь. Код выше, кажется, подрывает предназначенный дизайн материала для многострочных сообщений. Для справки: https://material.io/components/snackbars/#anatomy