Android Multiline Snackbar - программирование
Подтвердить что ты не робот

Android Multiline Snackbar

Я пытаюсь использовать новую Snackbar в библиотеке поддержки Android Design для отображения многострочной закусочной, как показано в 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();

Он отображает только First line... на моем Nexus 7. Как отобразить все строки?

PS: Я попробовал Toast и отобразил все строки.

4b9b3361

Ответ 1

Просто установите атрибут maxLines в Snackbars Textview

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

Ответ 2

Можно переопределить предопределенное значение, используемое для него в values.xml приложения

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

Это значение используется Snackbar по умолчанию.

Ответ 3

Вот мой вывод об этом:

Android поддерживает многострочные snackbars, но имеет максимальный предел в 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();

В этом случае я вижу многострочную снэк-панель с текстом 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 ...". Это означает, что библиотека дизайна намеренно вынуждает textview иметь максимум 2 строки.

Ответ 4

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

Ответ 5

Альтернативой предложениям, связанным с жесткой кодировкой идентификатора ресурса для текстового содержимого, содержащегося в закутке, является итерация, чтобы найти TextView. Это более безопасно долгосрочно и позволяет обновлять библиотеку поддержки с минимальным страхом изменения идентификатора.

Пример:

 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;
}

Ответ 6

Вместо использования setMaxLines я использую setSingleLine, чтобы сделать перенос textview в его содержимое.

String yourText = "First line\nSecond line\nThird line";
Snackbar snackbar = Snackbar.make(mView, yourText, Snackbar.LENGTH_SHORT);
    TextView textView =
        (TextView) snackbar.getView().findViewById(android.support.design.R.id.snackbar_text);
    textView.setSingleLine(false);
snackbar.show();

Ответ 7

это работает для меня

Snackbar snackbar =  Snackbar.make(mView, "Your text string", Snackbar.LENGTH_INDEFINITE);
((TextView) snackbar.getView().findViewById(android.support.design.R.id.snackbar_text)).setSingleLine(false);
snackbar.show();

Ответ 8

Поздно, но может быть полезно для кого-то:

public void showSnackBar(String txt, View view){
    final Snackbar snackbar = Snackbar.make(view,txt,Snackbar.LENGTH_INDEFINITE)
        .setAction("OK", new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //do something
            }
        });
    View view = snackbar.getView();
    TextView textView = (TextView) view.findViewById(android.support.design.R.id.snackbar_text);
    textView.setMaxLines(5);
    snackbar.show();
}

Ответ 9

Ссылка на дизайн материалов - 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()

Ответ 10

Способ сделать это, который не потерпит крах, если что-то изменится в более новых версиях библиотеки:

Snackbar.make(...).setAction(...) {
    ...
}.apply {
    (view.findViewById<View?>(R.id.snackbar_text) as? TextView?)?.setSingleLine(false)
}.show()

И способ сделать это без использования идентификаторов, установив для всех TextViews в Snackbar неограниченное количество строк:

@UiThread
fun setAllTextViewsToHaveInfiniteLinesCount(view: View) {
    when (view) {
        is TextView -> view.setSingleLine(false)
        is ViewGroup -> for (child in view.children)
            setAllTextViewsToHaveInfiniteLinesCount(child)
    }
}

Snackbar.make(...).setAction(...) {
    ...
}.apply {
    setAllTextViewsToHaveInfiniteLinesCount(view)
}.show()

Та же функция в Java:

@UiThread
public static void setAllTextViewsToHaveInfiniteLines(@Nullable final View view) {
    if (view == null)
        return;
    if (view instanceof TextView)
        ((TextView) view).setSingleLine(false);
    else if (view instanceof ViewGroup)
        for (Iterator<View> iterator = ViewGroupKt.getChildren((ViewGroup) view).iterator(); iterator.hasNext(); )
            setAllTextViewsToHaveInfiniteLines(iterator.next());
}

Ответ 11

В Kotlin вы можете просто сделать

Snackbar.make(rootView, "Yo!", Snackbar.LENGTH_LONG).apply {
    view.snackbar_text.setSingleLine(false)
    show()
}

Вы можете заменить setSingleLine(false) на maxLines = 3 если хотите.

Android Studio должна предложить добавить

import kotlinx.android.synthetic.main.design_layout_snackbar_include.view.*

Ответ 12

Просто быстрый комментарий, если вы используете com.google.android.material:material, префикс или пакет для R.id должен быть com.google.android.material

val snackbarView = snackbar.view
val textView = snackbarView.findViewById<TextView>(com.google.android.material.R.id.snackbar_text)
textView.maxLines = 3