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