在项目中遇到,图片下载的方法封装在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相关推荐

  1. Android开发2:事件处理及实现简单的对话框(Toast,AlertDialog,Snackbar,TextInputLayout的使用)...

    前言 啦啦啦~又要和大家一起学习Android开发啦,博主心里好激动哒~ 在上篇博文中,我们通过线性布局和基础组件的使用,完成了一个简单的学生课外体育积分电子认证系统的界面,本篇博文,将和大家一起熟悉 ...

  2. android 自定义 snackbar,Android Study Material Design 五 之:自定义Toast以及玩转SnackBar...

    > LZ-Says:有时候真的不需要让自己在意太多,在意的太多,反而有些累,计较太多,反而让自己患得患失,随心随性就好,愿各位伙计能开心撸码~ > LZ-Says:有时候真的不需要让自己在 ...

  3. html div toast,React实现全局组件:Toast轻提示

    Toast是常用的轻提示弹框,常用于页面loading和提示语弹窗. 本例基于React实现一个随时可调用且不随页面渲染的全局组件. 如何使用 首先引入 import Toast from './co ...

  4. React实现全局组件的Toast轻提示效果

    Toast是常用的轻提示弹框,常用于页面loading和提示语弹窗. 本例基于React实现一个随时可调用且不随页面渲染的全局组件. 需求分析 Toast 不需要同页面一起被渲染,而是根据需要被随时调 ...

  5. android 自定义 snackbar,自定义Toast以及玩转SnackBar

    原标题:自定义Toast以及玩转SnackBar 有时候真的不需要让自己在意太多,在意的太多,反而有些累,计较太多,反而让自己患得患失,随心随性就好,愿各位伙计能开心撸码~ 前言 今天我们来学习下有关 ...

  6. Android开发之全局异常捕获

    Android开发之全局异常捕获 [转载请注明出处]本文出自付小华的博客 http://blog.csdn.net/klxh2009 今晨谷歌正式发布Android 8.0,新版本的Android O ...

  7. android获取context的方法,Android编程获取全局Context的方法

    Android编程获取全局Context的方法 本文实例讲述了Android编程获取全局Context的方法.分享给大家供大家参考,具体如下: 有时,在处理业务逻辑的时候,需要Context对象,但在 ...

  8. Android~Compose脚手架和Toast

    系列文章目录 Android~Compose初探 Android~Compose之自定义View Android~Compose相关概念总结 Android~Compose脚手架和Toast Andr ...

  9. Android开发之自定义Toast(带详细注释)

    因为工作需求,所以自己研究了自定义Toast,这里做出总结: 在此之前有一点需要提前说明:Toast与其他组件一样,都属于UI界面中的内容,因此在子线程中无法使用Toast弹出提示内容,如果强行在子线 ...

最新文章

  1. solr单机版的搭建
  2. 大数据在高校的应用场景_高校大数据及AI应用解决方案
  3. spring IOC 注解@Autowired
  4. avframe转byte数组_C# amp; VB6.0 图像与二维数组 互转
  5. js解析java对象数组_js接收并转化Java中的数组对象的方法
  6. 【语音识别】基于matlab动态时间规整(DTW)孤立字语音识别【含Matlab源码 573期】
  7. QTableWidget 合并单元格
  8. 菜鸟攒机之深度学习(上)
  9. OC 实现扫雷达扫描动画
  10. GHOST XP SP2 遐想网络 纯净版
  11. iOS 获取指南针的数据
  12. 这些年我要读的书【不断更新中】
  13. 汉字 Unicode 编码范围
  14. 详解eclipse如何配置tomcat
  15. 《炬丰科技-半导体工艺》 组合式 CMP 和晶片清洗装置方法
  16. 华为鸿蒙系统什么时候出售,华为智慧屏搭载鸿蒙预约发售 华为鸿蒙系统手机什么时候上市 华为鸿蒙系统是什么系统?...
  17. java如何获取手机号码归属地_在java中如何根据手机号查询号码归属地
  18. mysql查询多个部门的子部门,数据库(多表查询,子查询)
  19. Excel明细生成多个word采购合同,Excel魔方完成
  20. Matlab 图片颜色反转 批量

热门文章

  1. python 读取文件夹下的所有文件夹名称和文件名称
  2. 八爪鱼大数据应用技能培训课程开始报名啦!
  3. CSS中 块级元素、行内元素、行内块元素区别
  4. 英国科学权威杂志上网成瘾 8大病态
  5. 车企出海异常拥挤,瞄准欧洲不再仅盯亚非拉?
  6. 产业安全公开课:2023年DDoS攻击趋势研判与企业防护新思路
  7. 基于ssm开发的求职简历管理网站
  8. java while语句打印三角形_Java 循环结构
  9. 智能显示模块120问
  10. Out of memory, malloc failed(tried to allocate XXXXXXX bytes)