40_Snackbar的简单使用

本文详细介绍了Android中的Snackbar组件,包括它的特点、使用方式及源码分析。Snackbar作为一种轻量级的提示方式,相较于Dialog和Toast有着更好的用户体验。文章还探讨了Snackbar与Activity的生命周期关系以及如何通过修改样式来定制Snackbar。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Demo地址:http://download.youkuaiyun.com/detail/baopengjian/9889432
#1 内容:
Snackbar使用及其源码分析
 
Android官网地址:https://developers.google.cn/china 
 
#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,
@Duration intduration) {
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、调度协调子布局
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值