android全局toast,全局Toast和Snackbar
在项目中遇到,图片下载的方法封装在imageUtils类中,下载要用Toast到提醒。如果在activity中可以用runOnUiThread和Handler来显示提醒,现在不是在activity,又不想在imageUtils中用Handler。所以想到如果有个全局的Toast就方便多了。
先上效果图:
Toast.gif
全局Toast:
1. 支持默认格式,自上向下布局为ImageView,TextView,TextView,三个控件可以自由组合显示或隐藏
2. 支持Top,Center,Bottom的位置显示
3. 支持多样的显示格式,可以传入自定义的layout的View
4. 共用一个Toast对象,防止多次Toast重叠并显示时间累加,该控件近保留最后一次的设置和显示。
5. 最好在自定义的Application中new该Toast,Activity,Fragment,Adapter中都可以直接调用。
自定义Toast代码如下, 用静态内部类Builder设置Toast的样式:
public class FlexibleToast {
public static final int GRAVITY_BOTTOM = 0;
public static final int GRAVITY_CENTER = 1;
public static final int GRAVITY_TOP = 2;
public static final int TOAST_SHORT = 0;
public static final int TOAST_LONG = 1;
private Context mContext;
private Toast flexibleToast;
public void toastShow(Builder builder) {
if (flexibleToast == null) {
flexibleToast = new Toast(mContext);
}
// toast position
if (builder.mGravity == GRAVITY_CENTER) {
flexibleToast.setGravity(Gravity.CENTER | Gravity.CENTER_VERTICAL, 0, 0);
} else if (builder.mGravity == GRAVITY_TOP) {
flexibleToast.setGravity(Gravity.TOP | Gravity.CENTER_VERTICAL, 0, Tools.dip2px(mContext, 20));
} else {
flexibleToast.setGravity(Gravity.BOTTOM | Gravity.CENTER_VERTICAL, 0, Tools.dip2px(mContext, 20));
}
if (builder.mDuration == TOAST_LONG) {
flexibleToast.setDuration(Toast.LENGTH_LONG);
} else {
flexibleToast.setDuration(Toast.LENGTH_SHORT);
}
if (builder.hasCustomerView && builder.mCustomerView != null) {
flexibleToast.setView(builder.mCustomerView);
} else {
flexibleToast.setView(builder.mDefaultView);
}
flexibleToast.show();
}
public FlexibleToast(Context context) {
mContext = context;
}
/**
* 控制Toast的显示样式
*/
public static class Builder {
private View mDefaultView;
private View mCustomerView;
private ImageView mIvImage;
private TextView mTvFirst;
private TextView mTvSecond;
private View dividerFirst;
private View dividerSecond;
private int mDuration = Toast.LENGTH_SHORT;// 0 short, 1 long
private int mGravity = 0;
private boolean hasCustomerView = false; // 是否使用自定义layout
/**
* 使用全局的ApplicationContext进行初始化
* @param context
*/
public Builder(Context context) {
mDefaultView = LayoutInflater.from(context).inflate(R.layout.layout_toast_flexible, null);
mIvImage = (ImageView) mDefaultView.findViewById(R.id.iv_img);
mTvFirst = (TextView) mDefaultView.findViewById(R.id.tv_text_first);
mTvSecond = (TextView) mDefaultView.findViewById(R.id.tv_text_second);
dividerFirst = mDefaultView.findViewById(R.id.divider_first);
dividerSecond = mDefaultView.findViewById(R.id.divider_second);
}
public Builder setImageResource(int resId) {
this.mIvImage.setImageResource(resId);
this.mIvImage.setVisibility(View.VISIBLE);
this.dividerFirst.setVisibility(View.VISIBLE);
return this;
}
public Builder setFirstText(String firstText) {
this.mTvFirst.setText(firstText);
this.mTvFirst.setVisibility(View.VISIBLE);
this.dividerSecond.setVisibility(View.VISIBLE);
return this;
}
public Builder setSecondText(String secondText) {
this.mTvSecond.setText(secondText);
this.mTvSecond.setVisibility(View.VISIBLE);
return this;
}
public Builder setDuration(int duration) {
this.mDuration = duration;
return this;
}
public Builder setGravity(int gravity) {
this.mGravity = gravity;
return this;
}
/**
* 为Toast指定自定义的layout,此时上面对ImageView和TextView的设置失效。
* @param customerView
* @return
*/
public Builder setCustomerView(View customerView) {
this.mCustomerView = customerView;
this.hasCustomerView = true;
return this;
}
}
}
在Application中初始化自定义Toast:
创建自定义ToastflexibleToast = new FlexibleToast(this),然后提供方法toastShowByBuilder()供调用传builder设置样式
public class BaseApp extends Application {
// 全局的 handler 对象
private final Handler appHandler = new Handler();
// 全局的 Toast 对象
private FlexibleToast flexibleToast;
private static BaseApp instance;
public static void setInstance(BaseApp instance) {
BaseApp.instance = instance;
}
public static BaseApp getInstance() {
return instance;
}
@Override
public void onCreate() {
super.onCreate();
setInstance(this);
flexibleToast = new FlexibleToast(this);
Log.i("TAG","主线程"+Thread.currentThread().getId());
}
public Handler getAppHandler() {
return appHandler;
}
public void toastShowByBuilder(final FlexibleToast.Builder builder) {
if (Looper.myLooper() != Looper.getMainLooper()) {
getAppHandler().post(new Runnable() {
@Override
public void run() {
flexibleToast.toastShow(builder);
}
});
} else {
flexibleToast.toastShow(builder);
}
}
}
下面分别列出Toast在屏幕中间、子线程、自定义显示的用法:
设置显示位置在屏幕中间:
FlexibleToast.Builder builder = new FlexibleToast.Builder(MainActivity.this)
.setGravity(FlexibleToast.GRAVITY_CENTER)
.setFirstText("中间").setSecondText("提醒");
BaseApp.getInstance().toastShowByBuilder(builder);
在子线程显示:
new Thread(new Runnable() {
@Override
public void run() {
Log.i("TAG","子线程");
FlexibleToast.Builder builder = new FlexibleToast.Builder(MainActivity.this)
.setGravity(FlexibleToast.GRAVITY_BOTTOM)
.setFirstText("底部").setSecondText("提醒");
BaseApp.getInstance().toastShowByBuilder(builder);
}
}).start();
自定义样式:
final View customview= LayoutInflater
.from(this)
.inflate(R.layout.item,null,false);
FlexibleToast.Builder builder = new FlexibleToast.Builder(MainActivity.this)
.setGravity(FlexibleToast.GRAVITY_BOTTOM)
.setCustomerView(customview);
BaseApp.getInstance().toastShowByBuilder(builder);
git上源代码地址,欢迎指出错误哈!
SnackBar是 Android Support Library 22.2.0 里面新增提供的一个控件。SnackBar默认从屏幕底部弹出,像Toast一样会自动消失,当然也可以手动划出屏幕消失。Toast是不能交互的,而如果需要,SnackBar默认是可以添加一个点击事件的。效果如下:
snackbar.gif
普通snackbar代码如下:
snckbar可以设置回调setCallback(new Snackbar.Callback())显示和取消分别处理,不知道snackbar的用法,请点击
还在用Toast?试试Snackbar!
Snackbar snackbar = Snackbar.make(button3,"normalSnackbar", LENGTH_LONG).setActionTextColor(getResources().getColor(R.color.white))
/* .setCallback(new Snackbar.Callback() {
@Override
public void onDismissed(Snackbar snackbar, int event) {
super.onDismissed(snackbar, event);
FlexibleToast.Builder builder = new FlexibleToast.Builder(MainActivity.this)
.setGravity(FlexibleToast.GRAVITY_CENTER)
.setFirstText("回调dismiss");
BaseApp.getInstance().toastShowByBuilder(builder);
}
@Override
public void onShown(Snackbar snackbar) {
super.onShown(snackbar);
FlexibleToast.Builder builder = new FlexibleToast.Builder(MainActivity.this)
.setGravity(FlexibleToast.GRAVITY_CENTER).setFirstText("回调show");
BaseApp.getInstance().toastShowByBuilder(builder);
}
})*/
.setAction("点击", new View.OnClickListener() {
@Override
public void onClick(View v) {
FlexibleToast.Builder builder = new FlexibleToast.Builder(MainActivity.this)
.setGravity(FlexibleToast.GRAVITY_CENTER).setFirstText("中间toast");
BaseApp.getInstance().toastShowByBuilder(builder);
}
});
snackbar.show();
自定义snackbar代码如下:
Snackbar snackbar = Snackbar.make(findViewById(R.id.button4),"自定义",Snackbar.LENGTH_LONG);
View view = snackbar.getView();
ViewGroup.LayoutParams Params = view.getLayoutParams();
view.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
CoordinatorLayout.LayoutParams layoutParams = new CoordinatorLayout.LayoutParams(Params.width,Params.height);
layoutParams.gravity = Gravity.TOP;
// TODO 为什么设置居中没反应
// layoutParams.gravity = Gravity.CENTER;为什么设置居中没反应
view.setLayoutParams(layoutParams);
view.setBackgroundColor(getResources().getColor(R.color.colorPrimary));
// view.setAnimation();
ImageView imageView = new ImageView(MainActivity.this);
imageView.setLayoutParams(new ViewGroup.LayoutParams(100,100));
imageView.setImageDrawable(getResources().getDrawable(R.drawable.lufei));
Snackbar.SnackbarLayout snackbarLayout = (Snackbar.SnackbarLayout) view;
snackbarLayout.setOrientation(LinearLayout.HORIZONTAL);
snackbarLayout.addView(imageView);
snackbar.setAction("点击", new View.OnClickListener() {
@Override
public void onClick(View v) {
FlexibleToast.Builder builder = new FlexibleToast.Builder(MainActivity.this).setGravity(FlexibleToast.GRAVITY_CENTER).setFirstText("自定义的snackbar");
BaseApp.getInstance().toastShowByBuilder(builder);
}
}).show();
git上源代码地址,欢迎指出错误哈!
想要设置snackbar剧中显示layoutParams.gravity = Gravity.CENTER;居然没有效果,不知道哪里出错了,有哪个兄弟看到了能指出,不胜感激!!!
android全局toast,全局Toast和Snackbar相关推荐
- Android开发2:事件处理及实现简单的对话框(Toast,AlertDialog,Snackbar,TextInputLayout的使用)...
前言 啦啦啦~又要和大家一起学习Android开发啦,博主心里好激动哒~ 在上篇博文中,我们通过线性布局和基础组件的使用,完成了一个简单的学生课外体育积分电子认证系统的界面,本篇博文,将和大家一起熟悉 ...
- android 自定义 snackbar,Android Study Material Design 五 之:自定义Toast以及玩转SnackBar...
> LZ-Says:有时候真的不需要让自己在意太多,在意的太多,反而有些累,计较太多,反而让自己患得患失,随心随性就好,愿各位伙计能开心撸码~ > LZ-Says:有时候真的不需要让自己在 ...
- html div toast,React实现全局组件:Toast轻提示
Toast是常用的轻提示弹框,常用于页面loading和提示语弹窗. 本例基于React实现一个随时可调用且不随页面渲染的全局组件. 如何使用 首先引入 import Toast from './co ...
- React实现全局组件的Toast轻提示效果
Toast是常用的轻提示弹框,常用于页面loading和提示语弹窗. 本例基于React实现一个随时可调用且不随页面渲染的全局组件. 需求分析 Toast 不需要同页面一起被渲染,而是根据需要被随时调 ...
- android 自定义 snackbar,自定义Toast以及玩转SnackBar
原标题:自定义Toast以及玩转SnackBar 有时候真的不需要让自己在意太多,在意的太多,反而有些累,计较太多,反而让自己患得患失,随心随性就好,愿各位伙计能开心撸码~ 前言 今天我们来学习下有关 ...
- Android开发之全局异常捕获
Android开发之全局异常捕获 [转载请注明出处]本文出自付小华的博客 http://blog.csdn.net/klxh2009 今晨谷歌正式发布Android 8.0,新版本的Android O ...
- android获取context的方法,Android编程获取全局Context的方法
Android编程获取全局Context的方法 本文实例讲述了Android编程获取全局Context的方法.分享给大家供大家参考,具体如下: 有时,在处理业务逻辑的时候,需要Context对象,但在 ...
- Android~Compose脚手架和Toast
系列文章目录 Android~Compose初探 Android~Compose之自定义View Android~Compose相关概念总结 Android~Compose脚手架和Toast Andr ...
- Android开发之自定义Toast(带详细注释)
因为工作需求,所以自己研究了自定义Toast,这里做出总结: 在此之前有一点需要提前说明:Toast与其他组件一样,都属于UI界面中的内容,因此在子线程中无法使用Toast弹出提示内容,如果强行在子线 ...
最新文章
- solr单机版的搭建
- 大数据在高校的应用场景_高校大数据及AI应用解决方案
- spring IOC 注解@Autowired
- avframe转byte数组_C# amp; VB6.0 图像与二维数组 互转
- js解析java对象数组_js接收并转化Java中的数组对象的方法
- 【语音识别】基于matlab动态时间规整(DTW)孤立字语音识别【含Matlab源码 573期】
- QTableWidget 合并单元格
- 菜鸟攒机之深度学习(上)
- OC 实现扫雷达扫描动画
- GHOST XP SP2 遐想网络 纯净版
- iOS 获取指南针的数据
- 这些年我要读的书【不断更新中】
- 汉字 Unicode 编码范围
- 详解eclipse如何配置tomcat
- 《炬丰科技-半导体工艺》 组合式 CMP 和晶片清洗装置方法
- 华为鸿蒙系统什么时候出售,华为智慧屏搭载鸿蒙预约发售 华为鸿蒙系统手机什么时候上市 华为鸿蒙系统是什么系统?...
- java如何获取手机号码归属地_在java中如何根据手机号查询号码归属地
- mysql查询多个部门的子部门,数据库(多表查询,子查询)
- Excel明细生成多个word采购合同,Excel魔方完成
- Matlab 图片颜色反转 批量