SnackBar是一个新控件,它的作用是类似Toast的。如果需要一个弹出消息提示,可以考虑用SnackBar替换Toast。
1.SnackBar有一些交互动画,那么父布局最好是android.support.design.widget.CoordinatorLayout
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:id="@+id/mcoor"
android:layout_height="match_parent"
tools:context="com.yidaitest.myapplication.MainActivity">
<android.support.design.widget.FloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|bottom"
android:layout_margin="16dp"
android:id="@+id/floating"
/>
</android.support.design.widget.CoordinatorLayout>
2.创建SnackBar实例,调用show,因为SnackBar创建次数过多,会造成内存增加
public class MainActivity extends AppCompatActivity {
private FloatingActionButton mfloat;
private CoordinatorLayout mCoorlayout;
private int SnackCount = 0; //创建SnackBar的次数
private int clearSnackCount = 5; // 当创建SnackBar的次数超过5次就调用gc
/**
* 创建SnackBar次数,每次创建SnackBar的时候调用一次
*/
public void countSnackBarCreate() {
SnackCount++;
if(SnackCount >= clearSnackCount) {
System.gc();
SnackCount = 0;
}
}
/**
* 改变snackbar的背景和文字颜色
* @param snackbar
* @param color
*/
public void setSnackBackground(Snackbar snackbar,int color) {
View view = snackbar.getView();
((TextView)view.findViewById(android.support.design.R.id.snackbar_text)).setTextColor(color);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mfloat = (FloatingActionButton) this.findViewById(R.id.floating);
mCoorlayout = (CoordinatorLayout) this.findViewById(R.id.mcoor);
mfloat.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Snackbar snackbar = Snackbar.make(mCoorlayout, "Snackbar", 0).setAction("snackclick", new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
// 改变背景颜色
setSnackBackground(snackbar,Color.BLUE);
snackbar.show();
// 如果创建SnackBar对象超过5次,就手动回收
countSnackBarCreate();
}
});
}
}
普通SnackBar效果图
3.自定义SnackBar
本来是不应该自定SnackBar,因为SnackBar作用类似于Toast,专注轻量级的交互,何必整一个复杂的布局呢。但是如果真的有需求,那么也可以做到。如果想要复杂的交互,应该用Dialog,不应该用SnackBar。
那么什么是复杂的交互呢?响应的事件超过2个以上,就不要用SnackBar了。
3.1 自定义布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"/>
<TextView
android:id="@+id/snackbartextview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="hahahahahah"/>
</LinearLayout>
3.2 得到snackbarlayout,重新设置params
/**
* 自定义snackbar
* @param snackBar
* @param string
*/
public void setCustomSnackBar(Snackbar snackBar,String string) {
View view = snackBar.getView();
// 得到SnackbarLayout
Snackbar.SnackbarLayout snackbarLayout = ( Snackbar.SnackbarLayout )view;
View childView = View.inflate(getApplicationContext(),R.layout.snackbar_custom,null);
TextView textView = (TextView) childView.findViewById(R.id.snackbartextview);
textView.setText(string);
// 重新设置控件布局参数params
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.CENTER_VERTICAL;
// 将自定义布局添加进snackbarLayout
snackbarLayout.addView(childView,params);
}
效果图
4.一个封装的SnackBarUtil,转载别人的
http://www.jianshu.com/p/cd1e80e64311