SnackBar是 Android Support Library 22.2.0 里面新增提供的一個控件,可以把它理解成一個加強版的Toast,或者是一個輕量級的Dialog。SnackBar默認從屏幕底部彈出,像Toast一樣會自動消失,當然也可以手動劃出屏幕消失。Toast是不能交互的,而如果需要,SnackBar默認是可以添加一個點擊事件的。官方也是推薦使用Snackbar代替Toast,你的項目中還在用Toast嗎?不妨試試炫酷的SnackBar!
Snackbar的用法幾乎和Toast一毛一樣:
Toast這么寫:
Toast.makeText(context, "it is Toast", Toast.LENGTH_SHORT).show();
Snackbar這么寫:
Snackbar.make(view, "it is Snackbar", Snackbar.LENGTH_SHORT).show();
二者都有三個參數,區別就在于第一個參數,其中Toast傳入的是Context,而Snackbar傳入的是View。Context已無需多講,而Snackbar的參數中傳入一個View是幾個意思呢?先說下Toast吧,其實Toast是個系統級窗口,相當于懸浮在所有View的上面。而SnackBar卻不是這樣,它需要有一個View來承載,SnackBar會遍歷整個View Tree來找到一個合適的View承載SnackBar的View,如果你想要實現上面的動畫交互效果的話最好是傳入CoordinatorLayout對象,而如果傳入RelativeLayout或者LinearLayout是不會有動畫效果的。那CoordinatorLayout是個什么玩意呢?以后有機會再專門介紹吧,這里就先不講了。
前面已經說了Snackbar可以加一個點擊事件,加起來有相當簡單:
Snackbar.make(findViewById(R.id.tv), "it is Snackbar", Snackbar.LENGTH_SHORT)
.setAction("點我", new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "it is Toast", Toast.LENGTH_SHORT).show();
}
}) .show();
我去,按鈕(“點我”)居然是玫紅色,不要擔心,這個當然是可以自定義的,只需要加一個顏色就好。
Snackbar.make(findViewById(R.id.tv), "it is Snackbar", Snackbar.LENGTH_SHORT)
//設置按鈕顏色
.setActionTextColor(Color.WHITE)
.setAction("點我", new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "it is Toast", Toast.LENGTH_SHORT).show();
}
}) .show();
這樣就變成了白色。
另外SnackBar還貼心的提供了關于show和dismiss的回調方法:
Snackbar.make(findViewById(R.id.tv), "it is Snackbar", Snackbar.LENGTH_SHORT)
.setActionTextColor(Color.WHITE)
.setCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar snackbar, int event) {
super.onDismissed(snackbar, event);
Toast.makeText(MainActivity.this, "Snackbar dismiss", Toast.LENGTH_SHORT).show();
}
@Override
public void onShown(Snackbar snackbar) {
super.onShown(snackbar);
Toast.makeText(MainActivity.this, "Snackbar show", Toast.LENGTH_SHORT).show();
}
})
.setAction("點我", new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "it is Toast", Toast.LENGTH_SHORT).show();
}
}) .show();
盡管Snackbar已經很炫酷很漂亮,但我知道它依然無法滿足你不走尋常路的心,那要不然我們再想辦法自定義一個唄。那我們先改變下Snackbar的背景色或者背景圖吧。
Snackbar bar=Snackbar.make(findViewById(R.id.tv), "it is Snackbar",Snackbar.LENGTH_SHORT);
View v=bar.getView();
v.setBackgroundColor(Color.GREEN);
bar.show();
什么?你還不滿意,還要改變顯示位置?還要加個icon?動畫也要改一改?沒關系,都可以。
Snackbar mSnackbar=Snackbar.make(findViewById(R.id.tv), "it is Snackbar", Snackbar.LENGTH_SHORT);
View v=mSnackbar.getView();
ViewGroup.LayoutParams vl = v.getLayoutParams();
CoordinatorLayout.LayoutParams cl = new CoordinatorLayout.LayoutParams(vl.width,vl.height);
//設置字體為紅色
((TextView) v.findViewById(R.id.snackbar_text)).setTextColor(Color.RED);
//設置顯示位置居中
cl.gravity = Gravity.CENTER;
v.setLayoutParams(cl);
//設置背景色為綠色
v.setBackgroundColor(Color.GREEN);
//自定義動畫
//v.setAnimation();
//設置icon
ImageView iconImage=new ImageView(MainActivity.this);
iconImage.setImageResource(R.mipmap.ic_launcher);
//icon插入布局
Snackbar.SnackbarLayout snackbarLayout = (Snackbar.SnackbarLayout) v;
snackbarLayout.addView(iconImage,0);
//設置按鈕為藍色
mSnackbar.setActionTextColor(Color.BLUE).setAction("點我", new View.OnClickListener() {
@Override
public void onClick(View v) {
}
}).show();
代碼略亂,童鞋們可以根據自己的業務需求做封裝。