巧用Snackbar代替Toast

SnackBar是 Android Support Library 22.2.0 裏面新增提供的一個控件,可以把它理解成一個加強版的Toast,或者是一個輕量級的Dialog。SnackBar默認從屏幕底部彈出,像Toast一樣會自動消失,當然也可以手動劃出屏幕消失。Toast是不能交互的,而如果需要,SnackBar默認是可以添加一個點擊事件的。官方也是推薦使用Snackbar代替Toast,你的項目中還在用Toast嗎?不妨試試炫酷的SnackBar!


snackbar.gif

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();

click.gif

我去,按鈕(“點我”)居然是玫紅色,不要擔心,這個當然是可以自定義的,只需要加一個顏色就好。

 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();

1.pic.png

什麼?你還不滿意,還要改變顯示位置?還要加個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();

snackbar.png

代碼略亂,童鞋們可以根據自己的業務需求做封裝。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章