Snackbar提供了一個介於Toast和AlertDialog之間輕量級控件,它可以很方便的提供消息的提示和動作反饋。
有時我們想這樣一種控件,我們想他可以想Toast一樣顯示完成便可以消失,又想在這個信息提示上進行用戶反饋。寫Toast沒有反饋效果,寫Dialog只能點擊去dismiss它,Snackbar完全可以達到這樣的需求。
在谷歌提出 material design 之後,終於推出了 Android.support.design 這個官方的material design庫,這幾天我也簡單瀏覽了下這個庫,基本上我們常用的組件都有了,今天的主角Snackbar就在這個庫中,因此要想使用SnackBar,首先我們就要引入這個庫。
引入這個庫的方法很簡單,首先找到你app的build gradle文件,引入如下代碼:
compile 'com.android.support:design:22.2.0'
如下:
然後點擊文件左上方的Sync Now按鈕如下:
這時再輸入Snackbar,如下:
也就是我們可以使用Snackbar了,可以通過一個簡單的實例來認識一下Snackbar,代碼如下:
public class MainActivity extends AppCompatActivity {
private TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = (TextView) this.findViewById(R.id.tv);
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Snackbar.make(tv, "this is message to show", Snackbar.LENGTH_LONG).
setAction("click", new View.OnClickListener() {
@Override
public void onClick(View v) {
tv.setText("click over");
}
}).show();
}
});
}
}
創建一個Snackbar需要調用其make方法,傳入三個參數,第一個是view,第二個是要顯示的信息,第三個是Snackbar顯示的時間,其源碼如下:
public static Snackbar make(View view, CharSequence text, int duration) {
Snackbar snackbar = new Snackbar(findSuitableParent(view));
snackbar.setText(text);
snackbar.setDuration(duration);
return snackbar;
}
爲Snackbar添加一個點擊事件的響應,可以調用setAction方法,傳入兩個參數,第一個是Action的提示內容,第二個是單擊事件的監聽,其源碼如下:
public Snackbar setAction(CharSequence text, final OnClickListener listener) {
TextView tv = this.mView.getActionView();//創建一個TextView響應Action事件
if(!TextUtils.isEmpty(text) && listener != null) {
tv.setVisibility(0);//0表示顯示
tv.setText(text);//設置顯示信息
tv.setOnClickListener(new OnClickListener() {
public void onClick(View view) {
listener.onClick(view);//爲這個TextView設置單擊事件監聽
Snackbar.this.dismiss();//這個TextView被點擊後Snackbar隱藏
}
});
} else {
tv.setVisibility(8);//表示不可見,並不佔空間;4表示不可見,但佔原來的空間
tv.setOnClickListener((OnClickListener)null);
}
return this;
}
從源碼可以看出來,點擊Snackbar的Action按鈕之後,Snackbar調用了其dismiss方法,隱藏Snackbar。
最後不要忘記調用show方法顯示Snackbar,其源碼如下:
public void show() {
SnackbarManager.getInstance().show(this.mDuration, this.mManagerCallback);
}
運行實例如下: