Android Multiline Snackbar

Dim*_*lov 77 android android-support-library android-design-library android-snackbar

我正在尝试利用SnackbarAndroid设计支持库中的新功能来显示多行快餐栏,如http://www.google.com/design/spec/components/snackbars-toasts.html#snackbars-toasts-specs中所示:

import android.support.design.widget.Snackbar;

final String snack = "First line\nSecond line\nThird line";
Snackbar.make(mView, snack, Snackbar.LENGTH_LONG).show();
Run Code Online (Sandbox Code Playgroud)

它只显示First line...在我的Nexus 7上.如何让它显示所有行?

PS:我试过Toast并显示所有线条.

Nil*_*nta 201

只需设置maxLinesSnackbars Textview 的属性即可

View snackbarView = snackbar.getView();
TextView textView = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
textView.setMaxLines(5);  // show multiple line
Run Code Online (Sandbox Code Playgroud)

  • 对于最新的androidx库,应为com.google.android.material.R.id.snackbar_text。但是恕我直言,ID可能会在将来更改,因此应避免这种做法。 (16认同)
  • 由于这依赖于可以随支持库的每个版本而变化的 TextView ID,因此这个答案并不是真正的永久解决方案,而是一个 hack。它可能有效,但也可能在生产中随机中断。 (2认同)

akd*_*005 28

可以覆盖app中values.xml中使用的预定义值

<integer name="design_snackbar_text_max_lines">5</integer>
Run Code Online (Sandbox Code Playgroud)

默认情况下,Snackbar使用此值.

  • 应该避免这种做法,因为它是由设计库定义的私有整数,可以重命名或删除,而不会在应用程序中生成任何编译或运行时错误. (16认同)
  • 是的,但我认为应该澄清这与访问操作系统的私有资源有很大不同.只要您坚持使用相同版本的设计库,这将有效.如果您更新到更新的版本,您必须彻底测试您的应用程序,只需将其放在您的清单上即可. (4认同)

mud*_*dit 10

以下是我的发现:

Android确实支持多行小吃店,但它最多限制为2行符合设计指南,其中多行小吃店的高度应为80dp(差不多2行)

为了验证这一点,我使用了cheesesquare android示例项目.如果我使用以下字符串:

Snackbar.make(view, "Random Text \n When a second snackbar is triggered while the first is displayed", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可以看到带有第二行文本的多行小吃店,即"当第二个小吃栏被触发时",但如果我将此代码更改为以下实现:

Snackbar.make(view, "Random Text \n When \n a second snackbar is triggered while the first is displayed", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
Run Code Online (Sandbox Code Playgroud)

我只能看到"随机文字\n当...... ".这意味着设计库有意强制textview最多2行.

  • 我接受了这个答案,但是材料规格也提到了带有112dp的小吃店:http://i.imgur.com/1ACCoQb.png (2认同)

Ram*_*h R 10

Snackbar snackbar =  Snackbar.make(view, "Text",Snackbar.LENGTH_LONG).setDuration(Snackbar.LENGTH_LONG);
View snackbarView = snackbar.getView();
TextView tv= (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text);
tv.setMaxLines(3); 
snackbar.show();
Run Code Online (Sandbox Code Playgroud)


Gab*_*tti 7

使用材料组件库,您可以使用snackbarTextViewStyle应用程序主题中的属性来定义它:

<style name="AppTheme" parent="Theme.MaterialComponents.*">
  ...
  <item name="snackbarTextViewStyle">@style/snackbar_text</item>
</style>

<style name="snackbar_text" parent="@style/Widget.MaterialComponents.Snackbar.TextView">
    ...
    <item name="android:maxLines">5</item>
</style>
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

注意:它需要库的1.2.0版本。

  • 好点,但该库仍处于 alpha 状态(2020 年 5 月):) (2认同)

Gum*_*een 6

在 Kotlin 中,你可以这样做

Snackbar.make(root_view, "Yo\nYo\nYo!", Snackbar.LENGTH_SHORT).apply {
    view.snackbar_text.setSingleLine(false)
    show()
}
Run Code Online (Sandbox Code Playgroud)

您也可以替换setSingleLine(false)maxLines = 3.

Android Studio 应该提示您添加

import kotlinx.android.synthetic.main.design_layout_snackbar_include.view.*
Run Code Online (Sandbox Code Playgroud)

编辑

我无法让它再次发挥作用,所以我将分享我认为用 Kotlin 编写的最简洁的方法,其他一些人已经分享过:

import com.google.android.material.R as MaterialR

Snackbar.make(root_view, "Yo\nYo\nYo!", Snackbar.LENGTH_SHORT).apply {
    val textView = view.findViewById<TextView>(MaterialR.id.snackbar_text)
    textView.setSingleLine(false)
    show()
}

Run Code Online (Sandbox Code Playgroud)


rmi*_*lle 6

对于材料设计,参考是 com.google.android.material.R.id.snackbar_text

val snack = Snackbar.make(myView, R.string.myLongText, Snackbar.LENGTH_INDEFINITE).apply {
                view.findViewById<TextView>(com.google.android.material.R.id.snackbar_text).maxLines = 10
            }
            snack.show()
Run Code Online (Sandbox Code Playgroud)


Vin*_*Sit 5

在 kotlin 中,您可以使用扩展。

// SnackbarExtensions.kt

fun Snackbar.allowInfiniteLines(): Snackbar {
    return apply { (view.findViewById<View?>(R.id.snackbar_text) as? TextView?)?.isSingleLine = false }
}
Run Code Online (Sandbox Code Playgroud)

用法:

Snackbar.make(view, message, Snackbar.LENGTH_LONG)
                        .allowInfiniteLines()
                        .show()
Run Code Online (Sandbox Code Playgroud)