SnackBar是 Android Support Library 22.2.0 裡面新增提供的一個控制元件,可以把它理解成一個加強版的Toast,或者是一個輕量級的Dialog。SnackBar預設從螢幕底部彈出,像Toast一樣會自動消失,當然也可以手動劃出螢幕消失。Toast是不能互動的,而如果需要,SnackBar預設是可以新增一個點選事件的。官方也是推薦使用Snackbar代替Toast,你的專案中還在用Toast嗎?不妨試試炫酷的SnackBar!
Snackbar的用法幾乎和Toast一毛一樣:
Toast這麼寫:
1 |
Toast.makeText(context, "it is Toast", Toast.LENGTH_SHORT).show(); |
1 |
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可以加一個點選事件,加起來有相當簡單:
1 2 3 4 5 6 7 8 |
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(); |
我去,按鈕(“點我”)居然是玫紅色,不要擔心,這個當然是可以自定義的,只需要加一個顏色就好。
1 2 3 4 5 6 7 8 9 10 |
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的回撥方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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(); |
1 2 3 4 |
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?動畫也要改一改?沒關係,都可以。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
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(); |
程式碼略亂,童鞋們可以根據自己的業務需求做封裝。