@lovesosoi
2017-10-15T13:51:35.000000Z
字数 3596
阅读 827
Snackbar 是轻量级的弹出框,可以在屏幕底部显示弹出消息,显示效果更丰富,外部布局为Coordinatorlayout时,可以向右滑动删除消息,同一时间只能显示一个Snackbar。
snackbar 使用与Toast 类似,一般都是用来相应按钮等点击事件,所以我们先定义一个按钮和它的点击事件。
1.常见Snackbar
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_snack_bar);
//初始化控件
initView();
//点击事件
tvOnClick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Snackbar.make(llSnackBar, "常见的SnackBar", 3000)
.setAction("点击", new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(
SnackBarActivity.this,
"不能滑动哦",
Toast.LENGTH_SHORT).show();
}
})
.show();
}
});
}
常见的Sanckbar的效果图
初始化控件的方法就不放出来了。其中 make()
方法中的第一个参数是: Snackbar 出现在哪个父布局上,第二个参数是:显是在左边的文字,第三个参数是 Snackbar 的显示时间长短,分别是 Snackbar.LENGTH_SHORT
, Snackbar.LENGTH_LONG
。setAction()
方法中第一个参数是右边的按钮显示的文字,第二个参数是点击后的的响应事件。 show()
方法是让 Snackbar 生效。
2.改变颜色的Sanckbar
主要思路:通过 Snackbar 的对象获取左右两边的 TextView 和 Button 通过 TextView 的方法去设置文字的相关属性及点击事件,Button 的设置同理。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_snack_bar);
//初始化控件
initView();
tvStyle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取 Snackbar 对象
final Snackbar sbSlide = Snackbar.make(
clSb,
"增加图标,颜色改变,文字可点击",
3000);
View view = sbSlide.getView();
//获取左边的Textview
TextView tvSbSuper = (TextView) view.findViewById(android.support.design.R.id.snackbar_text);
//获取右边的Button
Button btnSbSuper = (Button) view.findViewById(android.support.design.R.id.snackbar_action);
//设置文字颜色
tvSbSuper.setTextColor(getResources().getColor(R.color.colorPrimaryDark));
sbSlide.setActionTextColor(getResources().getColor(R.color.green));
btnSbSuper.setTextColor(Color.BLACK);
//左侧TextView 点击事件
tvSbSuper.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(
SnackBarActivity.this,
"点到了Tv",
Toast.LENGTH_SHORT)
.show();
sbSlide.dismiss();
}
});
//左侧 TextView设置 图片、背景颜色
Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher);
tvSbSuper.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null);
view.setBackgroundColor(Color.YELLOW);
sbSlide.setAction("点击", new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(
SnackBarActivity.this,
"可滑动删除哦",
Toast.LENGTH_SHORT)
.show();
}
}).show();
}
});
}
改变颜色Snackbar 的效果图
核心代码就是通过 Snackbar 对象找到Textview 和 Button 的对象,找到相应的对象后,进行相应的操作
3.改变布局的Snackbar
主要思路:通过 Snackbar 的对象找到 Snackbar 父布局 SnackbarLayout 的对象,将自己自定义的布局写在 src/res/layout
下,通过布局加载器将自定义的布局加载成View,通过父布局对象的addview()
方法,将布局添加进到 Snackbar 的布局下。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_snack_bar);
//初始化控件
initView();
tvStyle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final Snackbar sb = Snackbar.make(
clSb,
"更改布局的SnackBar,图片可点击",
Snackbar.LENGTH_LONG);
View view1 = sb.getView();
//Snackbar 的父布局
Snackbar.SnackbarLayout sl = (Snackbar.SnackbarLayout) view1;
//通过布局加载器加载布局
View inflate = LayoutInflater.from(sb.getContext()).inflate(R.layout.item_sb_layout, null);
ImageView imageView = (ImageView) inflate.findViewById(R.id.iv_sb);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(
SnackBarActivity.this,
"点击了图片",
Toast.LENGTH_SHORT).show();
sb.dismiss();
}
});
//对新的布局进行设置
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
layoutParams.gravity = Gravity.CENTER;
sl.removeAllViews();
//将布局加载到父布局
sl.addView(inflate, layoutParams);
sb.show();
}
});
}
改变布局的 Snackbar 效果图
需要注意的是: Snackbar 可添加view 可删除view,删除原Snackbar view 的子Viwe 后不能调用setAction()等跟原布局控件有关的方法,否则会崩溃。