Snackbar 多行文本填充

Posted

技术标签:

【中文标题】Snackbar 多行文本填充【英文标题】:Snackbar Multi-line text padding 【发布时间】:2020-02-09 07:30:45 【问题描述】:

令我惊讶的是,如果 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

【问题讨论】:

【参考方案1】:

目前(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 多行文本填充的主要内容,如果未能解决你的问题,请参考以下文章

Android 多行 Snackbar

Flutter SnackBar 在 Scaffold 中留下不可见的填充

Snackbar 操作文本颜色不变

如果文本太长,为啥 Snackbar 文本会消失?

如何将粗体文本设置为 Android Snackbar 操作文本?

从右到左 SnackBar