Snackbar是Android Support Design Library库中的一个控件,可以在屏幕底部快速弹出消息,比Toast更加好用。本文对原生Snackbar进行了修改,使其更加灵活。
Snackbar.make()源码:
@NonNull
public static Snackbar make(@NonNull View view, @NonNull CharSequence text,
@Duration int duration) {
Snackbar snackbar = new Snackbar(findSuitableParent(view));
snackbar.setText(text);
snackbar.setDuration(duration);
return snackbar;
}
第一步:build.gradle加入com.android.support:design库
compile 'com.android.support:design:24.1.0'
Snackbar的基本使用很简单,与Toast类似。
Snackbar.make(view, message_text, duration)
.setAction(action_text, click_listener)
.show();
view是一个
CoordinatorLayout,需要在xml里定义这个布局
例如:<android.support.design.widget.CoordinatorLayout
android:id="@+id/layoutRoot"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.FloatingActionButton
android:id="@+id/defaultSnakerbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right"
android:onClick="onClick"
android:src="@mipmap/ic_launcher"
app:borderWidth="0dp"
app:fabSize="normal"
/>
</android.support.design.widget.CoordinatorLayout>
package test.ban.com.snackbar;
import android.app.Activity;
import android.os.Bundle;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.Snackbar;
import android.view.View;
import android.widget.Toast;
import static test.ban.com.snackbar.R.id.bt1;
public class MainActivity extends Activity implements View.OnClickListener {
private CoordinatorLayout layoutRoot;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initViews();
}
private void initViews() {
layoutRoot = (CoordinatorLayout) findViewById(R.id.layoutRoot);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.defaultSnakerbar:
//默认综合带事件触发
Snackbar.make(layoutRoot, "这是massage!", Snackbar.LENGTH_SHORT)
.setAction("这是action!", new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "你点击了action!", Toast
.LENGTH_SHORT).show();
}
})
.setCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar snackbar, int event) {
Toast.makeText(MainActivity.this, "消失时触发的事件。", Toast
.LENGTH_SHORT).show();
}
@Override
public void onShown(Snackbar snackbar) {
Toast.makeText(MainActivity.this, "显示时触发的事件。", Toast
.LENGTH_SHORT).show();
}
})
.show();
break;
case bt1:
//简单使用
SnackbarUtil.ShortSnackbar(layoutRoot, "妹子向你发来一条消息", SnackbarUtil.Info).show();
break;
case R.id.bt2:
//自定义图片+自定义文字背景
Snackbar snackbar = Snackbar.make(layoutRoot, "这是massage", Snackbar.LENGTH_LONG);
SnackbarUtil.setSnackbarColor(snackbar, SnackbarUtil.green);
SnackbarUtil.SnackbarAddView(snackbar, R.layout.snackbar_addview, 0);
snackbar.show();
break;
case R.id.bt3:
//默认综合带事件触发
Snackbar.make(layoutRoot, "这是massage!", Snackbar.LENGTH_SHORT)
.setAction("这是action!", new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "你点击了action!", Toast
.LENGTH_SHORT).show();
}
})
.setCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar snackbar, int event) {
Toast.makeText(MainActivity.this, "消失时触发的事件。", Toast
.LENGTH_SHORT).show();
}
@Override
public void onShown(Snackbar snackbar) {
Toast.makeText(MainActivity.this, "显示时触发的事件。", Toast
.LENGTH_SHORT).show();
}
})
.show();
break;
}
}
}
SnackbarUtil
package test.ban.com.snackbar;/**
* Created by apple on 16/8/25.
*/
import android.graphics.Color;
import android.support.design.widget.Snackbar;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
/**
* 作者:ban on 16/8/25 11:07
*/
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);
}
}
activity_main.xml
<RelativeLayout 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:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.design.widget.CoordinatorLayout
android:id="@+id/layoutRoot"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.FloatingActionButton
android:id="@+id/defaultSnakerbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right"
android:onClick="onClick"
android:src="@mipmap/ic_launcher"
app:borderWidth="0dp"
app:fabSize="normal"
/>
</android.support.design.widget.CoordinatorLayout>
<Button
android:id="@+id/bt1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="简单使用-无事件触发"
/>
<Button
android:id="@+id/bt2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/bt1"
android:onClick="onClick"
android:text="自定义图片+自定义文字背景-无事件触发"
/>
<Button
android:id="@+id/bt3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/bt2"
android:onClick="onClick"
android:text="综合运用-有事件触发(同右下角按钮)"
/>
</RelativeLayout>
snackbar_addview.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@mipmap/ic_launcher"/>
</LinearLayout>
源码地址:http://download.csdn.net/detail/u010566681/9612525