Google在2015 I/O大会上,给咱们带来了更加详细的Material Design规范,同时也引入了Android Design Support Library,为咱们提供了基于Material设计规范的控件。它兼容性广,能兼容到android 2.1(按Google官方数据,兼容android 2.3以上便可覆盖当前市面上全部Android设备),而且高度封装,使用简洁,可谓业界良心之做。css
在与用户的交互过程当中,有时咱们须要给用户一些提示信息,甚至可能提供一些操做的选择。一般,咱们会使用Dialog或Toast来进行这种提示。这两种提示各有特色,但却彷佛都在各自的特色上走了极端。
Dialog的特色是,它弹出来的时候会中断用户当前的操做,直到这个Dialog被处理。它除了向用户提供一些信息以外,也可能包含一些操做,一般用于必须打断用户的提示,好比当用户进行清空数据等重要操做时进行二次确认的提示。
Toast则是走了另一个极端。它用于向用户提供少许的信息展现,而且不会中断用户当前的操做,这样在与用户的交互过程当中也不会显得唐突。但它也只能用于展现少许信息,不能向用户提供一些操做选择。
而在Android Design Support Library中,谷歌为咱们引入了Snackbar,它使用简单,与Toast类似,而且吸取了Dialog与Toast各自的优势,而避免了它们设计上的不足。它在界面的底部向用户展现少许信息,而且能够向用户提供一种轻量级的反馈操做,以下图:
在这个例子中,原先对于未验证的车牌是点击后直接跳到车牌列表的界面并提示去验证,但显然提示用户未验证并给出“去验证”的操做建议会更加友好。java
Snackbar的使用很简单,接口与Toast类似。像上面的图中的例子,代码以下:android
Snackbar.make(view, "须要验证该车牌才能使用该功能", Snackbar.LENGTH_LONG)
.setAction("去验证", new View.OnClickListener() {
@Override
public void onClick(View view) {
Activities.to(getActivity(), VehicleListActivity.class);
}
}).show();
Snackbar向咱们提供了如下相关的接口:markdown
static Snackbar make(View view, int resId, int duration)
与static Snackbar make(View view, CharSequence text, int duration)
:用于建立一个Snackbar,参数以下: view
:用于找到合适的parent的view,以把本身添加上去resId
及text
:展现的信息duration
:展现的时间,参数值以下: LENGTH_LONG
显示2750毫秒LENGTH_SHORT
显示1500毫秒LENGTH_INDEFINITE
一直展现,直到它被dismiss掉,或者是下一个Snackbar被显示时。setText(int resId)
与setText(CharSequence message)
:更新Snackbar上的提示消息。setAction(int resId, View.OnClickListener listener)
与setAction(CharSequence text, View.OnClickListener listener)
:设置显示到Snackbar上的操做。setActionTextColor(ColorStateList colors)
与setActionTextColor(int color)
:设置操做的文本颜色。setDuration(int duration)
及getDuration()
:设置及获取显示的时间show()
,dismiss()
及isShown()
:显示、隐藏Snackbar,以及判断当前Snackbar是否正在被显示。setCallback(Snackbar.Callback callback)
:设置当前Snackbar可见性变化时的回调Snackbar提供的接口很是简单而且易于理解,须要注意的是,与Toast不一样,当新的Snackbar被显示时,会先隐藏掉上一个Snackbar而后显示新的Snackbar,而不像Toast那样等前面的Toast显示完毕才显示。ide
Snackbar并无提供设置消息文本颜色的API。经过定位到它的布局代码,咱们能够看到它是经过一个style来配置:布局
android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"
该style对应源码:spa
<style name="TextAppearance.Design.Snackbar.Message" parent="android:TextAppearance"> <item name="android:textSize">@dimen/design_snackbar_text_size</item> <item name="android:textColor">?android:textColorPrimary</item> </style>
可见其颜色读的是theme中的android:textColorPrimary
的值。可是若是咱们想要修改它的颜色的话,配置android:textColorPrimary
是无效的,咱们要配置的是theme里面的android:textColor
。
而后可能有一个问题,一般咱们会在theme里使用这个属性为整个应用配置默认的文本颜色,好比在我公司的项目里,就使用#333
来做业默认的黑色文本,这样就使得Snackbar的提示消息看不见(Snackbar的背景色是#ff303030
)。这种状况下只能使用比较hack的方式来修改它的颜色值了。我试过覆盖它的style定义,可是未能成功。最后是经过getView()
接口获取到SnackbarLayout,再拿到里面的TextView来修改其文本颜色,代码以下:设计
((TextView)snackbar.getView().findViewById(android.support.design.R.id.snackbar_text)).setTextColor(Color.WHITE);
当Snackbar与CoordinatorLayout一块儿使用时,即Snackbar显示在CoordinatorLayout里面时,能够经过在Snackbar上右滑的操做把当前的Snackbar隐藏掉,即咱们在调用Snackbar.make(…)方法时,传入的View应该为CoordinatorLayout或CoordinatorLayout的子view。
另外Snackbar与FloatingActionButton若是都在CoordinatorLayout内时,Snackbar展现时FloatingActionButton会跟着上移,而不会出现互相遮挡的状况。 code