101

http://www.google.com/design/spec/components/snackbars-toasts.html#snackbars-toasts-specsSnackbarに示すように、Android Design Support Library のnew を活用して複数行のスナックバーを表示しようとしています。

import android.support.design.widget.Snackbar;

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

Nexus 7でのみ表示されますFirst line...。すべての行を表示するにはどうすればよいですか?

PS: 試しToastてみたところ、すべての行が表示されました。

4

19 に答える 19

248

maxLinesSnackbars Textviewの属性を設定するだけです

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

より新しい"com.google.android.material:material:1.0.0"依存関係を使用している場合は、これを使用します: com.google.android.material.R.id.snackbar_textSnackbar の TextView にアクセスします。

そのままでもお使いいただけますR.id.snackbar_text。それは私のための仕事です。

于 2015-07-15T11:24:03.107 に答える
33

アプリの values.xml で使用される定義済みの値をオーバーライドできます

<integer name="design_snackbar_text_max_lines">5</integer>

この値は、デフォルトで Snackbar によって使用されます。

于 2015-09-22T15:02:52.877 に答える
14
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();
于 2016-08-15T05:48:38.753 に答える
11

これが私の発見です:

Android は複数行のスナックバーをサポートしていますが、複数行のスナックバーの高さは 80 dp (ほぼ 2 行) である必要があるという設計ガイドラインに一致する最大 2 行の制限があります。

これを確認するために、チーズスクエア 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();

この場合、2行目のテキスト、つまり「2番目のスナックバーがトリガーされたとき」を含む複数行のスナックバーを見ることができますが、このコードを次の実装に変更すると:

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();

「Random Text\nWhen ... 」しか表示されません。これは、デザイン ライブラリが意図的にテキストビューを最大 2 行に強制していることを意味します。

于 2015-06-08T09:53:13.100 に答える
7

kotlin では拡張機能を使用できます。

// SnackbarExtensions.kt

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

使用法:

Snackbar.make(view, message, Snackbar.LENGTH_LONG)
                        .allowInfiniteLines()
                        .show()
于 2019-12-24T19:56:27.087 に答える
3

スナックバーに含まれるテキストビューのリソース ID をハードコーディングするという提案に代わる方法は、反復して TextView を見つけることです。これは長期的に安全であり、ID の変更を最小限に抑えてサポート ライブラリを更新できます。

例:

 public static Snackbar getSnackbar(View rootView, String message, int duration) {
    Snackbar snackbar = Snackbar.make(rootView, message, duration);
    ViewGroup snackbarLayout = (ViewGroup) snackbar.getView();

    TextView text = null;

    for (int i = 0; i < snackbarLayout.getChildCount(); i++) {
        View child = snackbarLayout.getChildAt(i);

        // Since action is a button, and Button extends TextView,
        // Need to make sure this is the message TextView, not the 
        // action Button view.
        if(child instanceof TextView && !(child instanceof Button)) {
            text = (TextView) child;
        }
    }

    if (text != null) {
        text.setMaxLines(3);
    }
    return snackbar;
}
于 2016-07-12T17:34:33.590 に答える
0

2021年のKotlinでの回答com.google.android.material:material:1.4.0

isSingleLine = falseと同様に必要ですmaxLines = 5

Snackbar.make(view, "line 1\nline 2", BaseTransientBottomBar.LENGTH_INDEFINITE)
    .apply {
        this.view.findViewById<TextView>(com.google.android.material.R.id.snackbar_text)?.apply {
            maxLines = 5
            isSingleLine = false
        }
    }
    .show()
于 2021-07-03T09:21:49.257 に答える