support last cardview android android-support-library android-design-library

last - Snackbar multilínea de Android



com.android.support:design 26 (12)

Aquí está mi hallazgo sobre esto:

Android admite barras de bocadillos multilínea, pero tiene un límite máximo de 2 líneas que coincide con la directriz de diseño donde dice que la altura de la barra de bocadillos multilínea debe ser 80dp (casi 2 líneas)

Para verificar esto, utilicé el proyecto de muestra de Android cheesesquare. Si uso la siguiente cadena:

Snackbar.make(view, "Random Text /n When a second snackbar is triggered while the first is displayed", Snackbar.LENGTH_LONG) .setAction("Action", null).show();

En este caso, puedo ver el snack bar multilínea con el texto de la segunda línea, es decir, "Cuando se activa un segundo snackbar", pero si cambio este código a la siguiente implementación:

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

Solo puedo ver el "Texto aleatorio / nCuando ... ". Esto significa que la biblioteca de diseño está forzando intencionalmente que la vista de texto tenga un máximo de 2 líneas.

Estoy tratando de aprovechar la nueva Snackbar de la Biblioteca de soporte de diseño de Android para mostrar la barra de varias líneas, como se muestra en 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();

Solo muestra la First line... en mi Nexus 7. ¿Cómo hacer que muestre todas las líneas?

PD: probé Toast y mostró todas las líneas.


En Kotlin, puedes hacer

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

Puede reemplazar setSingleLine(false) con maxLines = 3 si lo desea.

Android Studio debería solicitarle que agregue

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


En lugar de usar setMaxLines, uso setSingleLine para hacer que la vista de texto se ajuste a su contenido.

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


Para Diseño de materiales, la referencia es com.google.android.material.R.id.snackbar_text

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


Se puede anular el valor predefinido utilizado para eso en values.xml de la aplicación

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

Snackbar utiliza este valor de forma predeterminada.


Simplemente configure el atributo maxLines de Snackbars Textview

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


Solo un comentario rápido, si está usando com.google.android.material:material el prefijo o paquete para R.id debe ser com.google.android.material

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


Tarde, pero podría ser útil para alguien:

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


Una alternativa a las sugerencias que implican codificar el ID de recurso para la vista de texto contenida en la barra de snack es iterar para encontrar TextView. Es más seguro a largo plazo y le permite actualizar la biblioteca de soporte con un miedo mínimo al cambio de ID.

Ejemplo:

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


Una forma de hacerlo que no se bloqueará en caso de que las cosas cambien en las versiones más recientes de la biblioteca:

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

Y una forma de hacerlo sin tener que usar identificadores, configurando todas las vistas de texto en la barra de Snack para tener múltiples líneas ilimitadas:

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

La misma función en Java:

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


esto funciona para mi

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


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