【Android - MD】之Snackbar的使用
Snackbar 是 Android 5.0 新特性——Material Design 中的一个控件,用来代替 Toast ,Snackbar与Toast的主要区别是:Snackbar可以滑动退出,也可以处理用户交互(点击)事件。
Snackbar的特点如下:
- Snackbar会在超时或者用户在屏幕其他地方触摸之后自动消失
- 可以在屏幕上滑动关闭
- 出现时不会阻碍用户在屏幕上的输入
- 不支持输入
- 屏幕上同时最多只能显示一个Snackbar
- 如果在屏幕上有一个Snackbar的情况下再显示一个Snackbar,则先将当前显示的Snackbar隐藏后再显示新的Snackbar
- 可以在Snackbar中添加一个或多个按钮,处理用户点击事件
- Snackbar一般需要Coordinatorlayout来作为容器盛放,CoordinatorLayout保证Snackbar可以右滑推出
首先,使用MD包中的控件,都需要先在gradle文件中导入依赖:
compile 'com.android.support:design:25.0.0'
1、弹出Snackbar:
弹出Snackbar的方式是调用Snackbar类中的静态方法make(),返回一个Snackbar对象:
Snackbar simple_snackbar = Snackbar.make(container, "I am a Snackbar......", Snackbar.LENGTH_INDEFINITE);
simple_snackbar.show();
make()方法的第一个参数是Snackbar的容器对象,一般是一个CoordinatorLayout对象;
第二个参数是Snackbar中想要显示的内容,一般只能显示2行;
第三个参数是Snackbar想要显示的时间长短,有三个值:LENGTH_INDEFINITE 永远显示、LENGTH_LONG显示较长时间、LENGTH_SHORT 显示较短时间;
Snackbar也要像Toast一样,调用show()方法才能显示。
2、添加按钮:
除了显示之外,Snackbar中还可以有一个按钮,我们称之为Action,它显示在Snackbar的右边,可以通过Snackbar对象的setAction()方法设置:
Snackbar.make(container, "I am a Snackbar......", Snackbar.LENGTH_INDEFINITE)
.setAction("Action1", new View.OnClickListener() {
@Override
public void onClick(View v) {
Snackbar.make(container, "Action1 Clicked......", Snackbar.LENGTH_SHORT).show();
}
}).show();
可以看出来,setAction()方法中的第一个参数是按钮显示的文本;
第二个参数是点击按钮触发的事件。
3、添加显示/隐藏回调:
在Snackbar弹出和消失时,都会触发一个回调事件,我们可以通过Snackbar对象的setCallback()方法捕获它们:
Snackbar.make(container, "I am a Snackbar......", Snackbar.LENGTH_INDEFINITE)
.setCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar snackbar, int event) {
Toast.makeText(MainActivity.this, "Snackbar隐藏", Toast.LENGTH_SHORT).show();
} @Override
public void onShown(Snackbar snackbar) {
Toast.makeText(MainActivity.this, "Snackbar显示", Toast.LENGTH_SHORT).show();
}
});
Snackbar.Callback中有两个抽象方法,onDismissed()方法是当Snackbar消失的时候触发的事件;onShown()方法是当Snackbar显示的时候触发的事件。
4、动态设置属性:
Snackbar支持动态的设置一些属性,如Action的文本颜色、显示的文本内容、显示的持续时间等等:
// 使用Snackbar的API中的方法设置Action按钮的文本颜色
simple_snackbar.setActionTextColor(Color.GREEN);
// 动态的为Snackbar设置文本
simple_snackbar.setText("这是新的文本");
// 设置Snackbar显示的时间为一个具体的值
simple_snackbar.setDuration(5000);
其他的如显示文本的颜色、背景颜色等需要通过Snackbar对象的getView()方法获取View之后,通过View找到各个控件后才能进行属性的设置:
// 获取Snackbar中显示的View对象
View view = snackbar.getView();
// 找到Snackbar中的显示内容TextView并设置颜色
((TextView) view.findViewById(android.support.design.R.id.snackbar_text)).setTextColor(textColor);
// 找到Snackbar中的Action按钮并设置文本颜色
((TextView) view.findViewById(android.support.design.R.id.snackbar_action)).setTextColor(actionColor);
// 设置整个Snackbar的背景颜色
view.setBackgroundColor(bgColor);
到此为止,弹出的Snackbar的演示结果如下图所示:
5、向Snackbar中添加自定义View:
Android为我们提供的Snackbar中最多只能显示一个Action,如果多次调用setAction()方法设置Action,结果将是显示最后一次添加的Action。我们要想添加更过的按钮或其他控件,就需要调用这样一个工具类:
/**
* Snackbar的工具类
* addViewToSnackbar()方法:当需要自定义Snackbar时,调用这个方法在Snackbar的布局中添加一个新的控件
* setAction()方法:为Snackbar中新添加的按钮设置文本和点击事件
*/
public class SnackbarUtil {
/**
* 当需要自定义Snackbar时,调用这个方法在Snackbar的布局中添加一个新的控件
*
* @param snackbar Snackbar对象
* @param layoutId 新的布局ID
* @param index 当index值为1时,将新布局添加到消息文本后面,action按钮前面
*/
public static void addViewToSnackbar(Snackbar snackbar, int layoutId, int index) {
// 获取snackbar的View(实就是SnackbarLayout)
View snackbarview = snackbar.getView();
// 将获取的View转换成SnackbarLayout
Snackbar.SnackbarLayout snackbarLayout = (Snackbar.SnackbarLayout) snackbarview;
// 加载布局文件新建View
View add_view = LayoutInflater.from(snackbarview.getContext()).inflate(layoutId, null);
// 设置新建布局参数
LinearLayout.LayoutParams p = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
<span style="white-space:pre"> </span>LinearLayout.LayoutParams.WRAP_CONTENT);
// 设置新建布局在Snackbar内垂直居中显示
p.gravity = Gravity.CENTER_VERTICAL;
// 将新建布局添加进snackbarLayout相应位置
snackbarLayout.addView(add_view, index, p);
} /**
* 为Snackbar中新添加的按钮设置文本和点击事件
*
* @param snackbar Snackbar对象
* @param btn_id 新添加的按钮的ID
* @param action_string 新添加的按钮中展示的文本
* @param onClickListener 新添加的按钮的点击事件
*/
public static void setAction(Snackbar snackbar, int btn_id, String action_string, View.OnClickListener onClickListener) {
View view = snackbar.getView();//获取Snackbar的view
if (view != null) {
//为添加的按钮设置监听器
((Button) view.findViewById(btn_id)).setText(action_string);
(view.findViewById(btn_id)).setOnClickListener(onClickListener);
}
} /**
* 为Snackbar中新添加的ImageView设置展示的图片资源ID
*
* @param snackbar Snackbar对象
* @param iv_id ImageView的ID
* @param res_id 要在ImageView中展示的图片的资源ID
*/
public static void setImageAction(Snackbar snackbar, int iv_id, int res_id) {
View view = snackbar.getView();//获取Snackbar的view
if (view != null) {
//为添加的按钮设置监听器
((ImageView) view.findViewById(iv_id)).setImageResource(res_id);
}
}
}
然后,在代码中调用这个类中的addViewToSnackbar()和addAction()方法,就可以添加更过的View了:
// 添加一个自定义按钮
SnackbarUtil.addViewToSnackbar(custom_snackbar, R.layout.sideworks_extrabtn, 1);
SnackbarUtil.setAction(custom_snackbar, R.id.extra_btn, "取消", new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "取消删除", Toast.LENGTH_SHORT).show();
custom_snackbar.dismiss();
}
});
再多添加几个控件之后,运行结果如下图所示:
6、调整Snackbar显示的位置:
Android为我们提供的Snackbar默认是显示在屏幕的最底部,但是我们也可以自己定义Snackbar的显示位置,方法是设置Snackbar中View的LayoutParams,例如,我们想让Snackbar在父布局的中间显示,就可以这样写:
// 设置Snackbar在CoordinatorLayout中居中显示
View snackbarView = center_snackbar.getView();
ViewGroup.LayoutParams lp = snackbarView.getLayoutParams();
CoordinatorLayout.LayoutParams params = new CoordinatorLayout.LayoutParams(lp.width, lp.height);
params.gravity = Gravity.CENTER_VERTICAL;
snackbarView.setLayoutParams(params);
运行之后的结果如下图所示:
以上就是对Snackbar用法的简单介绍,下面贴出码云上的源码,供大家参考。
【Android - MD】之Snackbar的使用的更多相关文章
- 【Android - MD】之FloatingActionButton的使用
FloatingActionButton(FAB) 是 Android 5.0 新特性--Material Design 中的一个控件,是一种悬浮的按钮. FloatingActionButton 是 ...
- 【Android - MD】之CoordinatorLayout的使用
CoordinatorLayout是Android 5.0新特性--Material Design中的一个布局控件,主要用来协调各个子视图之间的工作,也可以用来作为顶部布局.CoordinatorLa ...
- 【Android - MD】之NavigationView的使用
NavigationView是Android 5.0新特性--Material Design中的一个布局控件,可以结合DrawerLayout使用,让侧滑菜单变得更加美观(可以添加头部布局). Nav ...
- 【Android - MD】之TextInputLayout的使用
TextInputLayout是Android 5.0新特性--Material Design中的一个布局控件,主要用来嵌套EditText,实现数据输入时的一些效果,如: 当输入框获取焦点时,输入提 ...
- 【Android - MD】之TabLayout的使用
TabLayout是Android 5.0新特性--Material Design中的一个控件,是一个标签页的导航条,常结合ViewPager完成页面导航. 和其他MD控件一样,使用TabLayout ...
- Android笔记之Snackbar的基本使用
使用Snackbar之前,须导入com.android.support:design 使用示例 package com.bu_ish.snackbar_test; import android.gra ...
- android开发之SnackBar的使用
SnackBar是一个类似于Toast的东西,它也有显示时长,但是比Toast更加灵活,同时,我们还可以给SnackBar设置点击事件,那么我们今天就来看看怎么用吧! 先来一张效果图: 这种效果大家可 ...
- 【Android - MD】之RecyclerView的使用
RecyclerView是Android 5.0新特性--Material Design中的一个控件,它将ListView.GridView整合到一起,可以使用极少的代码在ListView.GridV ...
- 【Android - MD】之CardView的使用
CardView是Android 5.0新特性--Material Design中的一个布局控件,可以通过属性设置显示一个圆角的类似卡片的视图. 1.CardView的属性: app:cardCorn ...
随机推荐
- fedora
http://blog.chinaunix.net/uid-14735472-id-3486501.html 使用 http://blog.csdn.net/crystony/article/deta ...
- python学习链接
http://www.cnblogs.com/dkblog/archive/2011/06/24/2089026.html 异常处理 http://xiagu1.iteye.com/blog/6195 ...
- Python学习笔记一--字符串的使用
一.基本操作 1. 合并字符串:“+” 2. 打印重复的字符串:"*" 3. 按位获取字符串中的字符:索引 4. 按位获取字符串中的子字符串:分片 5 ...
- A9裸机
Tiny4412裸机程序之操作ICache 一.首先普及一下什么是Cache 基于程序访问的局限性,在主存和CPU通用寄存器之前设置了一类高速的.容量较小的存储器,把正在执行的指令地址附件的一部分指令 ...
- php.ini – 配置文件详解
详见: https://my.oschina.net/miaowang/blog/299546 这个文件必须命名为''php.ini''并放置在httpd.conf中的PHPIniDir指令指定的目录 ...
- git svn rebase出现了checksum mismatch的错误
http://stackoverflow.com/questions/3156744/git-svn-rebase-checksum-mismatch This solution was the on ...
- Java中的protected访问修饰符
在某个类中定义的protected 方法和属性和默认权限方法和属性是一样的.比如,某类的protected 方法和属性在包外是不能通过该类实例进行访问的(你能在包外访问一个类的默认权限的方法和属性吗? ...
- NLog 传递参数
用NLog记文件日志,一般都用{$basedir}变量,把日志记在运行的目录或者它的子目录下,遇到要写在其他目录的下,看了下Nlog找到用环境变量传参数. .net 里写 Environment.Se ...
- UVa 11572 (滑动窗口) Unique Snowflakes
滑动窗口挺有意思的,如果符合条件右端点一直向前走,不符合的话,左端点向前走. #include <bits/stdc++.h> using namespace std; set<in ...
- CodeForces Round #285 Div.2
C.Misha and Forest (图论 BFS) 比赛进行了一半才想起来有场CF没打,=_=|| 前两道题快速切掉,C题一直卡没什么好的思路 憋了几天,忍不住偷偷瞄了一下别人AC的代码,发现我题 ...