J'essaie de tirer parti de la nouvelle Snackbar
de Android Design Support Library pour afficher le snack-bar multiligne, comme indiqué dans 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();
Il n’affiche que First line...
sur mon Nexus 7. Comment lui faire afficher toutes les lignes?
PS: J'ai essayé Toast
et toutes les lignes étaient affichées.
Il suffit de définir l'attribut 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
On peut remplacer la valeur prédéfinie utilisée pour cela dans values.xml de l'application
<integer name="design_snackbar_text_max_lines">5</integer>
Cette valeur est utilisée par Snackbar par défaut.
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();
Voici ma conclusion sur ceci:
Android prend en charge les barres multi-lignes multi-lignes, mais sa limite maximale est de 2 lignes, ce qui correspond à la directive de conception spécifiant que la hauteur d'une barre multi-lignes doit être de 80dp (presque 2 lignes).
Pour vérifier cela, j'ai utilisé le projet d'exemple cheesesquare Android. Si j'utilise la chaîne suivante:
Snackbar.make(view, "Random Text \n When a second snackbar is triggered while the first is displayed", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
Dans ce cas, je peux voir le snack-bar multiligne avec le texte de la 2ème ligne, c'est-à-dire "Lorsqu'un deuxième snack-bar est déclenché", mais si je change ce code en implémentation suivante:
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();
Je ne peux voir que le "Texte aléatoire\nLorsque ...". Cela signifie que la bibliothèque de conception force intentionnellement la vue texte à un maximum de 2 lignes.
Une alternative aux suggestions impliquant le codage en dur de l'ID de ressource pour la vue texte contenue par la barre de contrôle consiste à effectuer une itération pour trouver la vue TextView. C'est plus sûr à long terme et vous permet de mettre à jour la bibliothèque de support avec une peur minimale de changer d'identifiant.
Exemple:
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;
}
Au lieu d'utiliser setMaxLines, j'utilise setSingleLine pour que la vue textview soit renvoyée à son contenu.
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();
ça marche pour moi
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();
En retard, mais pourrait être utile à quelqu'un:
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();
}
Une façon de le faire qui ne plantera pas si les choses changent avec les nouvelles versions de la bibliothèque:
Snackbar.make(...).setAction(...) {
...
}.apply {
(view.findViewById<View?>(R.id.snackbar_text) as? TextView?)?.setSingleLine(false)
}.show()
Et un moyen de le faire sans avoir d’identifiants, en configurant tous les TextViews du Snackbar sur plusieurs lignes illimitées:
@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()
La même fonction en 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());
}
Pour Material Design, la référence est 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()
À Kotlin, vous pouvez simplement faire
Snackbar.make(rootView, "Yo!", Snackbar.LENGTH_LONG).apply {
view.snackbar_text.setSingleLine(false)
show()
}
Vous pouvez remplacer setSingleLine(false)
par maxLines = 3
Si vous le souhaitez.
Android Studio devrait vous inviter à ajouter
import kotlinx.Android.synthetic.main.design_layout_snackbar_include.view.*