Android多行小吃店
我正在尝试利用Androiddevise支持库中的新Snackbar
来显示多行快照栏,如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
,它显示了所有的行。
只需设置Snackbars Textview的maxLines
属性即可
View snackbarView = snackbar.getView(); TextView textView = (TextView) snackbarView.findViewById(android.support.design.R.id.snackbar_text); textView.setMaxLines(5); // show multiple line
可以覆盖应用程序的values.xml中使用的预定义值
<integer name="design_snackbar_text_max_lines">5</integer>
Snackbar默认使用此值。
这是我的发现:
Android确实支持多行快餐吧,但是它的最大限制是2行,符合devise指南,多行快餐吧的高度应该是80dp(差不多2行)
为了validation这一点,我使用了cheesesquare android示例项目。 如果我使用以下string:
Snackbar.make(view, "Random Text \n When a second snackbar is triggered while the first is displayed", Snackbar.LENGTH_LONG) .setAction("Action", null).show();
在这种情况下,我可以看到第二行文字的多行快餐栏,即“当第二个快餐栏被触发”,但如果我将此代码更改为以下实施:
Snackbar.make(view, "Random Text \n When \na second snackbar is triggered while the first is displayed", Snackbar.LENGTH_LONG) .setAction("Action", null).show();
我只能看到“随机文本\ n当…… ”。 这意味着devise库是故意强制textview是最多2行。
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();
对包含快餐栏的textview的资源ID进行硬编码的build议的替代方法是迭代查找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; }
而不是使用setMaxLines,我使用setSingleLine使文本视图换行到其内容。
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();
这对我有用
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();
晚了,但可能对某人有所帮助:
public void showSnackBar(String txt,View view){ Snackbar snackbar = null; final Snackbar finalSnackbar = snackbar; snackbar=Snackbar.make(view,txt,Snackbar.LENGTH_INDEFINITE).setAction("OK", new View.OnClickListener() { @Override public void onClick(View view) { finalSnackbar.dismiss(); } }); View view=snackbar.getView(); TextView textView = (TextView) view.findViewById(android.support.design.R.id.snackbar_text); textView.setMaxLines(5); snackbar.show(); }