前言

Snackbar和Toast相似,都是为了给用户提供交互信息,Snackbar是固定在底部的,显示时从下往上滑出

要使用Snackbar,需要在项目的build.gradle中添加依赖

dependencies {

compile 'com.android.support:design:23.4.0'

}

Snackbar的使用方法和Toast很相似

Snackbar.make(mOpenTv, "消息内容", Snackbar.LENGTH_SHORT)

.setAction("确定", new View.OnClickListener() {

@Override

public void onClick(View v) {

}

})

.show();

第一个参数需要传入一个View,可以是界面当中的任意一个View控件,Snackbar会自动根据这个控件找到最外层的布局来显示

第二个参数就是我们需要显示的内容,注意这里的内容最多显示两行哦,超出两行后的内容会变成“…”

第三个参数为Snackbar显示的时长,有三种模式供选择

LENGTH_SHORT:短时间显示

LENGTH_LONG:长时间显示

LENGTH_INDEFINITE:一直显示,只有当用户触发Action点击事件或手动删除时才会消失

Snackbar可以通过setAction方法设置一个点击事件,和用户进行交互

我们还可以通过setCallback方法来监听Snackbar的显示和关闭

Snackbar sb = Snackbar.make(mOpenTv, "消息内容", Snackbar.LENGTH_SHORT);

sb.setCallback(new Snackbar.Callback() {

@Override

public void onDismissed(Snackbar snackbar, int event) {

super.onDismissed(snackbar, event);

// Snackbar关闭时回调

}

@Override

public void onShown(Snackbar snackbar) {

super.onShown(snackbar);

// Snackbar打开时回调

}

});

sb.show();

Snackbar还支持滑出删除,需要在布局文件中使用CoordinatorLayout作为根布局

建议要使用Snackbar的时候最好是以CoordinatorLayout作为根布局,如果以其它RelativeLayout,LinearLayout等作为根布局的话,会出现以下这种情况

FloatingActionButton被遮到了,使用CoordinatorLayout作为根布局可以避免这种情况

Snackbar只能在底部显示吗?

是也不是,为啥这么说呢,Snackbar确实是在CoordinatorLayout底部显示的,但并不等于是在屏幕顶部

首先我们要知道Snackbar显示的原理是什么

之前介绍中的第一个传进去的参数View,Snackbar会通过这个View控件找到它所在的根布局,我们来查看下源码

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;

}

我们传进去的view会经过findSuitableParent方法的处理,我们再来看下这个方法的具体实现

private static ViewGroup findSuitableParent(View view) {

ViewGroup fallback = null;

do {

if (view instanceof CoordinatorLayout) {

// We've found a CoordinatorLayout, use it

return (ViewGroup) view;

} else if (view instanceof FrameLayout) {

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

final ViewParent parent = view.getParent();

view = parent instanceof View ? (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

return fallback;

}

详细的过程google的工程师已经写的非常的清楚了,我们主要需要了解的就是当一个View的直接父布局为CoordinatorLayout时,就以这个CoordinatorLayout为标准来显示Snackbar

我们可以做个小实验验证一下

在传入的View控件外面套一层CoordinatorLayout

android:layout_width="match_parent"

android:layout_height="100dp">

android:id="@+id/tv_open_snackbar"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:gravity="center"

android:text="打开Snackbar"

android:textSize="28sp"/>

再运行一下看看,效果就变成了下面这样

所以说Snackbar的显示位置还是可以通过这个小技巧来改变的

如果嫌默认的Snackbar太丑怎么办?

我们可以来自定义它的外观

1.改变按钮的文字颜色

通过调用setActionTextColor方法即可改变按钮的文字颜色

Snackbar sb = Snackbar.make(mOpenTv, "消息内容", Snackbar.LENGTH_SHORT);

sb.setAction("确定", new View.OnClickListener() {

@Override

public void onClick(View v) {

}

});

sb.setActionTextColor(Color.YELLOW);

sb.show();

2.改变消息内容的文字颜色

Snackbar没有给我们提供改变消息文本颜色的api接口,但在查看源码时发现了这个方法getView

/**

* Returns the {@link Snackbar}'s view.

*/

@NonNull

public View getView() {

return mView;

}

这里返回的mView其实是一个SnackbarLayout布局,在SnackbarLayout的构造方法中找到了它的布局文件design_layout_snackbar_include

// Now inflate our content. We need to do this manually rather than using an

// in the layout since older versions of the Android do not inflate includes with

// the correct Context.

LayoutInflater.from(context).inflate(R.layout.design_layout_snackbar_include, this);

design_layout_snackbar_include布局文件里只有两个控件,一个TextView,一个Button

android:id="@+id/snackbar_text"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_weight="1"

android:paddingTop="@dimen/design_snackbar_padding_vertical"

android:paddingBottom="@dimen/design_snackbar_padding_vertical"

android:paddingLeft="@dimen/design_snackbar_padding_horizontal"

android:paddingRight="@dimen/design_snackbar_padding_horizontal"

android:textAppearance="@style/TextAppearance.Design.Snackbar.Message"

android:maxLines="@integer/design_snackbar_text_max_lines"

android:layout_gravity="center_vertical|left|start"

android:ellipsize="end"

android:textAlignment="viewStart"/>

android:id="@+id/snackbar_action"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginLeft="@dimen/design_snackbar_extra_spacing_horizontal"

android:layout_marginStart="@dimen/design_snackbar_extra_spacing_horizontal"

android:layout_gravity="center_vertical|right|end"

android:paddingTop="@dimen/design_snackbar_padding_vertical"

android:paddingBottom="@dimen/design_snackbar_padding_vertical"

android:paddingLeft="@dimen/design_snackbar_padding_horizontal"

android:paddingRight="@dimen/design_snackbar_padding_horizontal"

android:visibility="gone"

android:textColor="?attr/colorAccent"

style="?attr/borderlessButtonStyle"/>

相信看到这里大家应该知道怎么做了,TextView的id为snackbar_text,我们通过getView()来获取这个TextView控件

Snackbar sb = Snackbar.make(mOpenTv, "消息内容", Snackbar.LENGTH_SHORT);

sb.setAction("确定", new View.OnClickListener() {

@Override

public void onClick(View v) {

}

});

sb.setActionTextColor(Color.YELLOW);

View view = sb.getView();

TextView tv = (TextView) view.findViewById(R.id.snackbar_text);

tv.setTextColor(Color.RED);

sb.show();

同样的,我们也可以通过tv.setTextSize设置它的文字大小

3.改变消息内容的背景

同理,根据以上方法,得到它的布局,调用对应的api接口就好

View view = sb.getView();

view.setBackgroundColor(Color.RED);

像这种红红的给用户警告的提示,是不是比Toast要来的炫酷多了呢

4.给消息内容添加图标

获取到消息内容的TextView后,调用setCompoundDrawables方法设置它的图标,可自由选择图标放置的位置,四个参数分别对应TextView的左、上、右、下

Snackbar sb = Snackbar.make(mOpenTv, "消息内容", Snackbar.LENGTH_SHORT);

sb.setAction("确定", new View.OnClickListener() {

@Override

public void onClick(View v) {

}

});

sb.setActionTextColor(Color.YELLOW);

View view = sb.getView();

TextView tv = (TextView) view.findViewById(R.id.snackbar_text);

Drawable d = ContextCompat.getDrawable(this, R.drawable.warn);

d.setBounds(0, 0, d.getMinimumWidth(), d.getMinimumHeight());

tv.setCompoundDrawables(d, null, null, null); // 给TextView左边添加图标

tv.setGravity(Gravity.CENTER); // 让文字居中

sb.show();

}

注意要设置setGravity使其居中,不然文字默认在上面不好看啊

就先介绍这么多,其实只要拿到了它的布局,接下来怎么整就看各位的喜好啦

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

android snackbar源码,Android中Snackbar的使用方法及小技巧相关推荐

  1. [Android精品源码] Android 仿美团网,探索ListView的A-Z字母排序功能实现选择城市

    Material Design中文版Code4APPPHP100UI4APP 开启辅助访问设为首页收藏本站快捷导航切换到宽版切换风格 石刚 | |我的 |签到打卡 |设置 |消息 |提醒(2) |退出 ...

  2. android intent 源码,Android 基础之 IntentService 源码

    Android 基础之 IntentService 源码 Android,IntentService,源码 IntentService 位于 android.app 包下面,是 Service 的一个 ...

  3. android snackbar源码,android Snackbar

    项目里好久不用这个东东了,抓紧写个文章记录一下,其实使用挺简单的 首先第一步是导包 导入design包,因为这个东西在这个包里面, 下面就是使用了下面一个简单的例子: public void clic ...

  4. android图库源码,android从系统图库中取图片的实例代码

    本文实例讲述了android从系统图库中取图片的实现方法.分享给大家供大家参考.具体如下: 在自己应用中,从系统图库中取图片,然后截取其中一部分,再返回到自己应用中.这是很多有关图片的应用需要的功能. ...

  5. 怎么看android底层源码,Android 底层按键获取

    与用户交互的输入设备(触摸屏,键盘等)是获取用户意图的来源.由于硬件本身的物理特性及由各大硬件厂商的标准不一,这将导致我们从设备上获取到的键值存在一定的差异性,为了让系统能够正确处理用户的操作,我们就 ...

  6. 怎么看android底层源码,Android底层有必定的认识,研究过相关的Android源码

    1.系统架构:java 一).系统分层:(由下向上)[如图]android 一.安卓系统分为四层,分别是Linux内核层.Libraries层.FrameWork层,以及Applications层:g ...

  7. android面试 源码,Android面试题-onCreate源码都没看过,怎好意思说自己做android-Go语言中文社区...

    自定义控件 联网 工具 数据库 源码分析相关面试题 Activity相关面试题 Service相关面试题 与XMPP相关面试题 与性能优化相关面试题 与登录相关面试题 与开发相关面试题 与人事相关面试 ...

  8. android 赛车 源码,android 3D风格赛车游戏源码

    android 3D风格赛车游戏源码,基于Libgdx 框架开发,三维视觉,包含20量敌方车辆和10量我方车辆,支持Admob广告插件,带游戏排行榜和成就系统 ,兼容手机.平板电脑等多种屏幕尺寸 ,游 ...

  9. android 点赞源码,android仿即刻点赞文字部分的自定义View的示例代码

    概述:在学习HenCoder的过程中,有一期是模仿优秀自定义View,有一个项目是仿即刻的点赞,后来原作者在点评中提到,需要将文字和图片分开来写,并且模仿者的动画实现由点杂乱.所以决定重现实现下文字部 ...

最新文章

  1. Java内存溢出的详细解决方案
  2. 在R语言环境中无法载入rJava包的解决办法
  3. 人的大脑皮层对产品设计有何启发?
  4. String,StringBuffer与StringBuilder的区别?
  5. docker 覆盖 entrypoint_跟我一起学docker(八)--Dockerfile
  6. 如果降低sbus总线的传输速率/帧率,sbus怎样转UART,sbus接到4G
  7. html插入循环图片,javascript – HTML5在带有for循环的画布上绘制图片?
  8. 【react】 flux 的数据修改流程,类似与vuex那样,但是又有区别
  9. 关于学习 unity3D 的知识预储备
  10. win10蓝牙开关不见了_来自德国,比JBL更硬汉,这款户外蓝牙音箱,上得厅堂下得厨房...
  11. 关于CUDA,cuDNN,TF,CUDA驱动版本兼容问题
  12. 车型代号对照表_2017年最新主机厂车型代号对照表
  13. 地图学:专题地图制作详细步骤
  14. PS证件照蓝底转白底红底转白底
  15. 双头巨人 (twin)
  16. 太原理工大学计算机专业全国排名,2020计算机专业大学排名
  17. 腾讯地图标记点击事件
  18. CentOS 7安装Mongodb并使用Robo 3T远程测试连接
  19. 小白学习深度学习的一点心得
  20. 【从0到1搭建LoRa物联网】4、国产LoRa终端ASR6505普通GPIO

热门文章

  1. 机器学习之:LLE (locally linear embedding) 局部线性嵌入降维算法
  2. lab-on-a-disc 实现血液中血细胞与血浆分离的一种方法
  3. moment获取2周后日期
  4. 从此以后是有家室的人了
  5. 嵌入式单片机基础篇(八)之两只看门狗
  6. 基于环信sdk在uni-app框架中快速开发一款多平台社交Demo
  7. 从八个方面让你快速了解cordova(一)
  8. 千万别升级 Mac 新系统,开发者周知!!!
  9. Java自动化(操作浏览器)
  10. java jpanel类_Swing JPanel类