安卓开发基础——简化Toast调用方法

2,445 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情

前言

有时候我们开发时会发现有些方法调用非常多,但它的默认的调用方法却要传很多参数进去而且还得记得调用具体的写法,比如Toast,不止要调用makeText()方法还得在makeText()方法后加上show():

Toast.makeText(context, "A", Toast.LENGTH_LONG).show()

有时候就会因为忘记调show()方法而不显示,结果导致很多奇怪的Bug,所以对其的简化还是很有必要的。

正篇

正如前言中所说的那样,我们在开发中通常对一些调用麻烦但用到很多的方法进行包装,比如实现成方法或者集成到一个工具类中,有的还提取到公共类或方法中,有的如果有必要也可以写成单例,总之我们的简化方法还是非常多的,关键在于想要的效果如何。

实现方法

说了这么多,那么我们怎么对Toast方法简化呢?

image.png 其实这里的做法很简单,只要我们新建一个Toast.kt文件,用我们Kotlin语言特有的扩展函数为Toast调用方法简化:

image.png

import android.content.Context
import android.widget.Toast

//工具方法
//添加扩展函数
//简化Toast调用方法

fun String.showToast(context : Context) {
    Toast.makeText(context, this, Toast.LENGTH_LONG).show()
}

fun Int.showToast(context : Context) {
    Toast.makeText(context, this, Toast.LENGTH_LONG).show()
}

我们创建好Toast.kt文件后就去除默认加上的class类,并为String和Int类各写一个扩展方法,然后我们在扩展方法中调用Toast方法,将其中的第二个参数(弹出的内容)换成this参数,就能更简单的使用Toast方法了:

image.png

这种调用方法其实就是扩展了我们一些类的方法,所以叫做扩展方法,Kotlin语言这一方式的实现让我们有更为灵活的选择与操作空间,但具体是否有风险,还需要看看我们实现扩展方法的目的:

fun XXXClass.funXXX(XXX) {
    ...
}

具体的调用方式

因为写了两种类型的扩展方法,我们就能选择具体的调用方式:

字符串调用:

"start ActivityPlayVideo".showToast(applicationContext)

定义在string.xml的字符串资源调用:

R.string.app_name.showToast(applicationContext)

可以看出我们对该类型具体实现对象调用我们扩展方法就OK了。

但我们仍需要优化该工具方法,因为此时我们是写死了弹出时长的,不过Kotlin中有对函数设置参数默认值的功能:

image.png

fun String.showToast(context : Context, duration: Int = Toast.LENGTH_LONG) {
    Toast.makeText(context, this, duration).show()
}

fun Int.showToast(context : Context, duration: Int = Toast.LENGTH_LONG) {
    Toast.makeText(context, this, duration).show()
}

这样写好后,我们就在不需要设置弹出时间时不去输入第二个参数,默认时间,而在有弹出时长需求时改变第二个参数duration来设置时长:

image.png

//默认弹出时长
"start ActivityPlayVideo".showToast(applicationContext)
//手动设置弹出时长
R.string.app_name.showToast(applicationContext, 500)

题外话

最终,我们就简化好了Toast,后续在App中调用它也更加方便好用,当然,其实最好还加上对子线程的支持,因为子线程对UI不能直接操作。

总结

虽然方法很简单,但在项目开发中的确蛮有作用的,简化了编写代码的过程。