Snackbar的简单使用

来源:互联网 发布:日本菜刀 知乎 编辑:程序博客网 时间:2024/06/02 18:06
Demo地址:http://download.csdn.net/detail/baopengjian/9889432
#1 内容:
Snackbar使用及其源码分析

Android官网地址:https://developers.google.cn/china 
Android中文地址:https://developer.android.com/reference/android/support/design/widget/Snackbar.html

#2 Snackbar
1. 常见的信息提示:
dialog: 笨拙 体验大打折扣,会阻断用户的连段性 ,交互性太强
Snackbar:中间产物,弹出一个可轻量级 交互的信息显示,
Toast :提示信息,没有交互性
2. Snackbar位于Design包
design包与support包的关系: Android Support Library 是基本支持包,而Android Design Support Library包还包含八种MaterialDesign的控件:
  Navigation View——抽屉导航
   TextInputLayout——EditText悬浮标签
   Floating Action Button——悬浮操作按钮
   Snackbar——提示(类似Toast)
   TabLayout——选项卡
   CoordinatorLayout——滚动控制
   CollapsingToolbarLayout——可折叠的Toolbar(Google+、photos中的效果)
   AppBarLayout——容器AppBar

3. SnackBar引入
Project Structure -> 选中项目 -> Dependencies -> +号搜索design -> 选中依赖包

4. SnackBar的特点
1) SnackBar可以自动消失,也可以手动取消, 而Toast虽然可以手动取消, 但是无法一直显示

2) Snackbar类似dialog, 生命周期跟随当前Activity, FrameLayout.addView() ;而Toast跟当前Activity没有关系(和PhoneWindow有关 ) .在Activity结束的时候,SnackBar会消失,这点Toast不会

3) 显示在最上层 没用控件可以覆盖它;位置在屏幕的下方,不可以直接改变,但可以通过分析源码,找到间接改变其位置的方法
4) 只要有View的地方就可以创建Snackbar,而dialog不可以

5. API
a. 简单显示,并自动消失:
Snackbar.make(btn,"This is the message of Snackbar",Snackbar.LENGTH_SHORT).show();

b. 带点击Action提示,提示会自动消失
Snackbar.make(btn,"This is the message of Snackbar",Snackbar.LENGTH_SHORT).setAction("确定",new View.OnClickListener(){
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"点击了确定",Toast.LENGTH_SHORT).show();
}
}).show();

c. 当需要设置提示不自动消失时,设置
Snackbar.make(btn,"This is the message of Snackbar",Snackbar.LENGTH_INDEFINITE)

d.显示和消失的监听
long time;
.setCallback(newSnackbar.Callback(){
@Override
public voidonShown(Snackbar sb) {
super.onShown(sb);
time= System.currentTimeMillis();
}

@Override
public voidonDismissed(Snackbar transientBottomBar,intevent) {
super.onDismissed(transientBottomBar, event);
Log.i("MaiActivity","from show to dismiss durning "+(System.currentTimeMillis()-time));
}
})
//Snackbar.LENGTH_SHORT时事件间隔为:1776毫秒
e.设置"确定"文字颜色
setActionTextColor

6. 源码分析
(1)修改样式
Snackbar不能直接修改样式,但可以通过源码分析,找到修改的方法;

a. Snackbar的父类提供了一个getView方法,获取其根mView;
b. 通过findViewById找到内容文字的控件,从而改变其样式,其id为: R.id.snackbar_ text;
->design_layout_snackbar_include.xml (找其路径:copy path)
-> (design 的jar包中) C:\Users\Administrator\Desktop\Snackbar\app\build\intermediates\exploded-aar\com.android.support\design\26.0.0-alpha1\res\layout

(2)源码分析
看源码可以学习很多东西 用来制作浮动全局视图(以前通过windowmanger添加全局的浮动视图如350工具球,但现在有些厂商屏蔽了)
重点看Snackbar的make和show方法:

make方法中:
public staticSnackbar make(@NonNullView view, @NonNullCharSequence text,
@Durationintduration) {
finalViewGroup parent = findSuitableParent(view);

-> findSuitableParent 寻找activity 的根布局
ss
private staticViewGroup findSuitableParent(View view) {
ViewGroup fallback =null;
do{
if(viewinstanceofCoordinatorLayout) {
// We've found a CoordinatorLayout, use it
return(ViewGroup) view;
}else if(viewinstanceofFrameLayout) {
if(view.getId() == android.R.id.content) {
// If we've hit the decor content view, then we didn't find a CoL in the
// hierarchy, so use it.
return(ViewGroup) view;
}else{
// It's not the content view but we'll use it as our fallback
fallback = (ViewGroup) view;
}
}

if(view != null) {
// Else, we will loop and crawl up the view hierarchy and try to find a parent
finalViewParent parent = view.getParent();
view = parentinstanceofView ? (View) parent :null;
}
}while(view != null);

// If we reach here then we didn't find a CoL or a suitable content view so we'll fallback
returnfallback;
}
ss
可以通过CoordinatorLayout包裹Snackbar从而改变Snackbar的位置

SnackBar时序图:
-》make 给 mView 赋值

show()
mTargetParent寻找父布局的View
mTargetParent.addView(mView);
WindownManger

(3)CoordinatorLayout
CoordinatorLayout作为“super-powered FrameLayout”基本实现两个功能:
1、作为顶层布局
2、调度协调子布局