SnackBar是SupportDesignLibrary的一个重要控件。
1.依赖包:
compile 'com.android.support:design:24.2.1'
2.作用:类似Toast,显示提示信息,位于界面的底部
3.与Toast的不同点:显示在界面的底部;允许用户通过侧滑删除它;可以设置action,当用户点击SnackBar里的控件时,可以进行某些操作
4.使用SnackBar需注意:
A.make((@NonNull View view, @NonNull CharSequence text,@Durationint duration)
方法的第一个参数不能是ScrollView.因为使用SnackBar是将其addView()到父容器中,Scrollview只有一个Child
B.SnackBar使用时将其AddView()到父容器的,并且显示在底部,所以显示前要隐藏键盘
5.方法说明:
// 参数分别是父容器,提示信息,持续时间
public static Snackbar make(@NonNull View view, @NonNull CharSequence text,@Duration int duration)
SnackBar的常用方法:
// 用于给SnackBar设定一个Action,点击之后会回调OnclickListener中的Onclick方法
public Snackbar setAction(CharSequence text, final View.OnClickListener listener)
// 用于设定Action的字体颜色
public Snackbar setActionTextColor(@ColorInt int color)
// 设定提示的字体
public Snackbar setText(@NonNull CharSequence message)
// 展示SnackBar
public void show()
// 清除SnackBar
public void dismiss()
// 设置回调,比如OnDismissed或者OnShown
public Snackbar setCallback(Callback callback)
A.onDismissed(SnackBar snackBar,int event)
此方法在SnackBar在Dimenss时调用,event的类型有四种:
/** Indicates that the Snackbar was dismissed via a swipe.*/ public static final int DISMISS_EVENT_SWIPE = 0;//侧滑删除 /** Indicates that the Snackbar was dismissed via an action click.*/ public static final int DISMISS_EVENT_ACTION = 1;//点击action消失 /** Indicates that the Snackbar was dismissed via a timeout.*/ public static final int DISMISS_EVENT_TIMEOUT = 2;//超时自动消失 /** Indicates that the Snackbar was dismissed via a call to {@link #dismiss()}.*/ public static final int DISMISS_EVENT_MANUAL = 3;//新的snackbar产生 /** Indicates that the Snackbar was dismissed from a new Snackbar being shown.*/ public static final int DISMISS_EVENT_CONSECUTIVE = 4;
B onShown(SnackBar snackBar);
SnackBar可见时调用
6.修改SnackBar的背景色以及显示的文字颜色.
SnackBar里实现了一个继承与Linearlayout的SnackBarLayout,SnackBar的样式是由SnackBarLayot来实现的。SnackBarLayout里加载了一个R.layout.design_layout_snackbar_include的布局文件。
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<TextView
android:id="@+id/snackbar_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:paddingTop="14dp"
android:paddingBottom="14dp"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"
android:maxLines="2"
android:layout_gravity="center_vertical|left|start"
android:ellipsize="end"
android:textAlignment="viewStart"/>
<Button
android:id="@+id/snackbar_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="0dp"
android:layout_marginStart="0dp"
android:layout_gravity="center_vertical|right|end"
android:paddingTop="14dp"
android:paddingBottom="14dp"
android:paddingLeft="12dp"
android:paddingRight="12dp"
android:visibility="gone"
android:textColor="?attr/colorAccent"
style="?attr/borderlessButtonStyle"/>
</merge>
以snackbar_text为名的TextView就是Snackbar左侧的message,Button为Action的按钮
public static void setSnackbarColor(Snackbar snackbar, int messageColor, int backgroundColor) {
View view = snackbar.getView();//获取Snackbar的view
if(view!=null){
((TextView) view.findViewById(R.id.snackbar_text)).setTextColor(messageColor);//获取Snackbar的message控件,修改字体颜色
}
}
7.解决FloatingActionButton一起使用时,SnackBar将会遮挡FloatActionButton,导致体验效果不太好。
解决方案:
将FloatActionButton用CoordinatorLayout作为父容器,同时SnackBar的父容器为CoordinatorLayout即可。
8.SnackBar的工具类(借用简书的简名的工具类 么么哒):
/** * Created by meijing on 2017/2/15. */ public class SnackbarUtil { public static final int Info = 1; public static final int Confirm = 2; public static final int Warning = 3; public static final int Alert = 4; public static int red = 0xfff44336; public static int green = 0xff4caf50; public static int blue = 0xff2195f3; public static int orange = 0xffffc107; /** * 短显示Snackbar,自定义颜色 * @param view * @param message * @param messageColor * @param backgroundColor * @return */ public static Snackbar ShortSnackbar(View view, String message, int messageColor, int backgroundColor){ Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_SHORT); setSnackbarColor(snackbar,messageColor,backgroundColor); return snackbar; } /** * 长显示Snackbar,自定义颜色 * @param view * @param message * @param messageColor * @param backgroundColor * @return */ public static Snackbar LongSnackbar(View view, String message, int messageColor, int backgroundColor){ Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_LONG); setSnackbarColor(snackbar,messageColor,backgroundColor); return snackbar; } /** * 自定义时常显示Snackbar,自定义颜色 * @param view * @param message * @param messageColor * @param backgroundColor * @return */ public static Snackbar IndefiniteSnackbar(View view, String message,int duration,int messageColor, int backgroundColor){ Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_INDEFINITE).setDuration(duration); setSnackbarColor(snackbar,messageColor,backgroundColor); return snackbar; } /** * 短显示Snackbar,可选预设类型 * @param view * @param message * @param type * @return */ public static Snackbar ShortSnackbar(View view, String message, int type){ Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_SHORT); switchType(snackbar,type); return snackbar; } /** * 长显示Snackbar,可选预设类型 * @param view * @param message * @param type * @return */ public static Snackbar LongSnackbar(View view, String message,int type){ Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_LONG); switchType(snackbar,type); return snackbar; } /** * 自定义时常显示Snackbar,可选预设类型 * @param view * @param message * @param type * @return */ public static Snackbar IndefiniteSnackbar(View view, String message,int duration,int type){ Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_INDEFINITE).setDuration(duration); switchType(snackbar,type); return snackbar; } //选择预设类型 private static void switchType(Snackbar snackbar,int type){ switch (type){ case Info: setSnackbarColor(snackbar,blue); break; case Confirm: setSnackbarColor(snackbar,green); break; case Warning: setSnackbarColor(snackbar,orange); break; case Alert: setSnackbarColor(snackbar, Color.YELLOW,red); break; } } /** * 设置Snackbar背景颜色 * @param snackbar * @param backgroundColor */ public static void setSnackbarColor(Snackbar snackbar, int backgroundColor) { View view = snackbar.getView(); if(view!=null){ view.setBackgroundColor(backgroundColor); } } /** * 设置Snackbar文字和背景颜色 * @param snackbar * @param messageColor * @param backgroundColor */ public static void setSnackbarColor(Snackbar snackbar, int messageColor, int backgroundColor) { View view = snackbar.getView(); if(view!=null){ view.setBackgroundColor(backgroundColor); ((TextView) view.findViewById(R.id.snackbar_text)).setTextColor(messageColor); } } /** * 向Snackbar中添加view * @param snackbar * @param layoutId * @param index 新加布局在Snackbar中的位置 */ public static void SnackbarAddView( Snackbar snackbar,int layoutId,int index) { View snackbarview = snackbar.getView(); Snackbar.SnackbarLayout snackbarLayout=(Snackbar.SnackbarLayout)snackbarview; View add_view = LayoutInflater.from(snackbarview.getContext()).inflate(layoutId,null); LinearLayout.LayoutParams p = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT); p.gravity= Gravity.CENTER_VERTICAL; snackbarLayout.addView(add_view,index,p); } } // Snackbar snackbar= SnackbarUtil.ShortSnackbar(coordinator,"妹子删了你发出的消息",SnackbarUtil.Warning).setActionTextColor(Color.RED).setAction("再次发送", new View.OnClickListener() { // @Override // public void onClick(View v) { // SnackbarUtil.LongSnackbar(coordinator,"妹子已将你拉黑",SnackbarUtil.Alert).setActionTextColor(Color.WHITE).show(); // } // }); // //SnackbarUtil.SnackbarAddView(snackbar,R.layout.snackbar_addview,0); // // SnackbarUtil.SnackbarAddView(snackbar,R.layout.snackbar_addview2,2); // // snackbar.show();
9.SnackBar的使用
布局文件:
<?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" android:layout_width="match_parent" android:id="@+id/layout" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/rv_data" android:layout_width="match_parent" android:layout_height="match_parent"/> <android.support.design.widget.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="16dp" android:src="@android:drawable/ic_dialog_email" app:backgroundTint="#00ff00" app:elevation="6dp" app:fabSize="normal" app:layout_anchor="@+id/rv_data" app:layout_anchorGravity="bottom|right|end" app:pressedTranslationZ="8dp" app:rippleColor="#ff87ffeb" app:useCompatPadding="false"/> </android.support.design.widget.CoordinatorLayout>
Activity:
CoordinatorLayout main_layout= () findViewById(R.id.layout);FloatingActionButton fab=(FloatingActionButton)findViewById(R.id.fab);
fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Snackbar snackbar= Snackbar.make(main_layout,"无网络",Snackbar.LENGTH_SHORT).setAction("设置", new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(FloatActionButtonActivity.this,"去设置网络",Toast.LENGTH_SHORT).show(); } }) .setActionTextColor(getResources().getColor(R.color.colorPrimaryDark)) .setText("hehe") .setCallback(new Snackbar.Callback() { @Override public void onDismissed(Snackbar snackbar, int event) { super.onDismissed(snackbar, event); } @Override public void onShown(Snackbar snackbar) { super.onShown(snackbar); } });} });iew view = snackbar.getView();//获取Snackbar的view if(view!=null){ //设置背景色 view.setBackgroundColor(getResources().getColor(R.color.colorAccent));//修改view的背景色 //文字颜色 ((TextView) view.findViewById(R.id.snackbar_text)).setTextColor(getResources().getColor(R.color.colorPrimary));//获取Snackbar的message控件,修改字体颜色 }snackbar.show();
运行项目即可。