Snackbar 多行文本填充
Snackbar Multi-line text padding
令我惊讶的是,如果 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 的 material 设计文档,有一些没有额外垂直填充的多行 snackerbar 的示例,这正是我的目标。上面的代码似乎破坏了预期的 material 多行消息设计。以供参考:
https://material.io/components/snackbars/#anatomy
目前(1.1.0-beta01 和 1.2.0-alpha01)不是自定义填充的官方方法有 2 行。
唯一的 解决方法 (但它可以在下一个版本中停止工作)是在 dimens.xml
中定义
<dimen name="design_snackbar_padding_vertical_2lines">14dp</dimen>
或
<dimen name="design_snackbar_padding_vertical_2lines">@dimen/design_snackbar_padding_vertical</dimen>
之前和之后:
令我惊讶的是,如果 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 的 material 设计文档,有一些没有额外垂直填充的多行 snackerbar 的示例,这正是我的目标。上面的代码似乎破坏了预期的 material 多行消息设计。以供参考: https://material.io/components/snackbars/#anatomy
目前(1.1.0-beta01 和 1.2.0-alpha01)不是自定义填充的官方方法有 2 行。
唯一的 解决方法 (但它可以在下一个版本中停止工作)是在 dimens.xml
<dimen name="design_snackbar_padding_vertical_2lines">14dp</dimen>
或
<dimen name="design_snackbar_padding_vertical_2lines">@dimen/design_snackbar_padding_vertical</dimen>
之前和之后: