如何在Android上使用Kotlin显示Toast?

98

在不同的Kotlin Android示例中,我看到toast("一些消息...")toastLong("一些长消息")。例如:


view.setOnClickListener { toast("Click") }

据我所知,这是Activity的扩展函数。

您需要在何处定义toast()函数以便在整个项目中都可以使用?


你可以使用这个简单的 Kotlin 友好库。https://github.com/Sathawale27/KotlinToasts - Sarvesh Athawale
我在这个链接中回答了:https://dev59.com/AHA85IYBdhLWcg3wF_q0#63806312。希望这可以帮到你。 - Javid Sattar
18个回答

167

它可以是 Context 的扩展函数:

fun Context.toast(message: CharSequence) = 
    Toast.makeText(this, message, Toast.LENGTH_SHORT).show()

你可以将这个代码放在项目的任何位置,具体放在哪里由你自己决定。例如,你可以定义一个文件mypackage.util.ContextExtensions.kt,并将其作为顶级函数放置在那里。

每当你可以访问Context实例时,你可以导入该函数并使用它:

import mypackage.util.ContextExtensions.toast

fun myFun(context: Context) {
    context.toast("Hello world!")
}

110

这是Kotlin中的一行解决方案:

Toast.makeText(this@MainActivity, "Its a toast!", Toast.LENGTH_SHORT).show()

7
谢谢 @Zeero0,对 this@MainActivity 点了个赞。 - Ravi Vaniya
1
我对Kotlin还很陌生,请原谅我的无知,但这个回答如何解决问题? - user11566289
@Zeero0 你为什么不使用 requireContent() 而是用 this@MainActivity? - David
2
requireContext() 是 Fragment 的一部分,而不是 Activity。 - Zeero0

49

实际上它是 Kotlin 的一个扩展部分 Anko。语法如下:

toast("Hi there!")
toast(R.string.message)
longToast("Wow, such a duration")

在您的应用程序级别的build.gradle文件中添加 implementation "org.jetbrains.anko:anko-common:0.8.3"

import org.jetbrains.anko.toast添加到您的Activity中。


看起来安卓官方并不支持这个(我在安卓开发者网站上找不到任何关于Anko的参考资料)。为什么会这样呢?看起来非常有趣。 - Dakatine
2
这是一段时间之前的事情,当时 Kotlin 还没有被 Google 正式支持。Anko 似乎是一个未完成的项目。目标是完全替换 XML 用于布局,但他们并没有做得很好。Anko 的许多优点也逐渐融入了 Kotlin 中。 - Muz
谢谢,这�常有帮助。我�在想知�为什么Kotlin扩展没有�供这个扩展功能给Android。或者是已��供了,�是我找�到如何添加?🤔 - Dakatine

21

试一试

在活动中

Toast.makeText(applicationContext, "Test", Toast.LENGTH_LONG).show()

或者

Toast.makeText(this@MainActiivty, "Test", Toast.LENGTH_LONG).show()

在片段中

Toast.makeText(activity, "Test", Toast.LENGTH_LONG).show()
或者
Toast.makeText(activity?.applicationContext, "Test", Toast.LENGTH_LONG).show()

6
如果你不想使用 anko 并且想要创建自己的 Toast 扩展,你可以在一个没有类的 kotlin 文件中定义内联(或非内联)扩展,并且你可以在任何类中访问这个函数。
inline fun Context.toast(message:String){
   Toast.makeText(this, message , duration).show()
}

用法:

在Activity中,

toast("Toast Message")

在Fragment中,
context?.toast("Toast Message")

4
一个非常简单的扩展。
将此内容添加到toast.kt文件中。
import android.content.Context
import android.widget.Toast
import androidx.fragment.app.Fragment

inline fun Context.toast(message:()->String){
   Toast.makeText(this, message() , Toast.LENGTH_LONG).show()
}

inline fun Fragment.toast(message:()->String){
   Toast.makeText(this.context, message() , Toast.LENGTH_LONG).show()
}

那么你将会拥有

toast {
   "Hello World"
}

在片段和活动中都可以使用。


3

使用Kotlin的Anko时,在fragment中使用以下任一方式:

 activity.toast("string message") 

或者

 context.toast("string message")

或者

 view.holder.context.toast("string message")

3

通过这个Toast扩展函数,你可以在ActivityFragment中调用它们,你可以将this作为ActivityContext或者getApplication()作为FragmentContext传递进去,默认情况下生成的是Toast.LENGTH_SHORT,所以你不需要担心要传递它作为参数,但如果需要,你也可以覆盖它。

Kotlin

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

使用方法

showToast("John Doe")

如果您想覆盖持续时间。
showToast("John Doe", Toast.LENGTH_LONG)

为什么需要重新传递上下文?你完全可以像这样使用它:fun Context.toast(message: String, duration: Int = Toast.LENGTH_SHORT){ Toast.makeText(this, message , duration).show() }然后调用 toast("John Doe")toast("John Doe", Toast.LENGTH_LONG) - Ian Elvister
很好的贡献 @IanElvister,我会更新答案。 - Gastón Saillén

2

2

Android Toast for Kotlin

Activity(活动)

Toast.makeText(applicationContext, "message...", Toast.LENGTH_SHORT).show()

片段

Toast.makeText(activity, "message...", Toast.LENGTH_SHORT).show()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接