什么是EasyToast
EasyToast是开源基础组件集成库EasyAndroid中的基础组件之一。用于进行简化Toast操作。
EasyAndroid作为一款集成组件库,此库中所集成的组件,均包含以下特点,你可以放心使用~~
- 精简: 作为一款集成库,我不希望有那种大组件,尽量控制好集成库的大小。不要有冗余代码
- 内聚: 尽量减少甚至避免单一组件对别的模块进行依赖。做到组件间独立。
得益于良好的高内聚性
,若你只需要使用EasyToast. 那么可以直接去copy EasyToast源码文件到你的项目中,直接进行使用,也是没问题的~
特性
- 非常方便的进行Toast样式定制
- 可直接在任意线程中进行使用
- 当有新消息需要展示时。进行即时刷新。无需等待
用法
使用默认样式
我们来与原生使用方式进行下对比:
1. 原生方式
一般来说。使用默认样式时,我们通常都是使用下方的代码进行toast展示:
Toast.makeText(context, message, duration).show()
2. EasyToast方式
而对于EasyToast而言。我们只需要像下面这样调用即可:
EastToast.newBuilder().build().show(message)
或者使用资源id:
EasyToast.newBuilder().build().show(R.string.message)
当然,这个时候有人可能会说了。你这样也没比原生方式方便多少嘛!hold on! 别急。
由于这种使用默认Toast
的场景很多。所以这里我在EasyToast类中默认提供了DEFAULT
实例进行直接使用:
EasyToast.DEFAULT.show(message)
这样是不是就很简洁很一目了然了?
使用自定义样式
1. 原生方式
我们先来看,使用原生的方式进行toast定制应该是怎么样的:
// 1. 创建Toast实例
val toast = Toast(context)
// 2. 获取自定义布局与用于展示的文本控件
val container = LayoutInflater.from(context).inflate(R.layout.custom_toast, null)
val tv = container.findViewById(R.id.toast_tv)
// 3. 将控件与toast实例绑定
toast.view = contaienr
toast.duration = Toast.LENGTH_SHORT
// 最后设置值进行展示:
tv.setText(message)
toast.show()
2. EasyToast方式
// 创建实例时直接指定资源文件即可
EasyToast.newBuilder(R.layout.custom_toast, R.id.toast_tv)
.build().show(message)
可以看到。与默认样式相比。在进行自定义样式使用时,EasyToast能节省更多的代码。
当然,上面的写法,将创建与展示放在一起的做法,是不推荐的。推荐的方式是进行一次二次封装
. 将项目中所需要使用到的所有toast样式进行统一管理:
object ToastTools {
val default:EasyToast = EasyToast.DEFAULT// 默认样式
val customForNetwork:EasyToast by lazy {// 网络层独有样式
return EasyToast.newBuilder(R.layout.network_toast, R.id.toast_tv).build()
}
// 更多的样式
...
}
添加gravity与duration配置
既然是对Toast的封装, 那么Toast本身自带的gravity
与duration
配置当然也是支持的。
为了方式使用时产生混乱。EasyToast
只支持在进行实例创建时进行属性配置:
val toast = EasyToast.newBuilder()
// 设置gravity. 参考Toast#setGravity(gravity, offsetX, offsetY)方法
.setGravity(gravity:Int, offsetX:Int, offsetY:Int)
// 设置duration.参考Toast#setDuration(duration)方法
.setDuration(Toast.LENGTH_SHORT | Toast.LENGTH_LONG)
.build()
与原生toast相比的更多优势:
1. 在任意位置进行toast展示:
正如你上面看到的:EasyToast的展示。不再像原生toast一样。需要依赖外部传入context实例进行UI展示。而是直接指定具体的数据即可,这在一些工具库中需要进行展示时。是个很棒的特性:
EasyToast.DEFAULT.show(message)
2. 在任意线程进行toast展示:
这点是原生所不能比的。使用原生的Toast。你必须在UI线程
中进行toast的创建与展示
而EasyToast则没有此顾虑:因为对于EasyToast来说。toast的创建与展示。都是会被派发到主线程进行操作的:
fun show(message:String) {
...
if (Looper.myLooper() == Looper.getMainLooper()) {
showInternal(result)
} else {
mainHandler.post { showInternal(result) }
}
}
3. 即时更新toast文案
让我们来展示一个在子线程中连续展示toast文案的案例:
executor.execute {
for (index in 0..10) {
EasyToast.DEFAULT.show("自动更新无延迟提醒:$index")
Thread.sleep(300)
}
default.show("循环完毕")
}
效果展示
作者:Haoge
链接:https://juejin.im/post/5b0638336fb9a07aa9261ce6
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。