使用Kotlin的Android Toast

时间:2020-02-23 14:29:21  来源:igfitidea点击:

Android Toast是一个UI小部件,它会在屏幕上弹出一段时间。
与通知,警报或者工具提示消息非常相似。
在本教程中,我们将学习如何使用Kotlin编程语言创建Toast。

何时在Android应用中使用Toasts?

Toast消息用于向用户显示不重要的内容,但可能会帮助用户了解应用程序中当前发生的情况。
例如,为表单中的特定字段提供提示。

创建Toast的语法

我们可以使用Toast类创建一条Toast消息。

Toast.makeText(this, "Androidly Short Toasts", Toast.LENGTH_SHORT).show();

Toast.makeText(this, "Androidly Long Toasts", Toast.LENGTH_LONG).show();

吐司需要三个参数。

  • 语境
  • 信息
  • 持续时间

show()函数用于在屏幕上显示Toast。

我们可以自定义吐司的布局及其持续时间。

使用Kotlin的Android Toast

让我们使用Kotlin创建一个android应用并创建一些敬酒消息。

首先,如果您使用的是Android Studio 3.0,请创建一个新的Android Studio项目并包括Kotlin支持。

选择一个空的活动。

" custom_toast_layout.xml"用于为Toast定义自定义布局。

下面的代码段给出了我们activity_main.xml文件的布局。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:gravity="center"
  android:orientation="vertical">

  <Button
      android:id="@+id/btnShortToast"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="SHORT TOAST"

  <Button
      android:id="@+id/btnLongToast"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="LONG TOAST"

  <Button
      android:id="@+id/btnCustomToast"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="CUSTOM TOAST"

</LinearLayout>

我们在活动布局中创建了三个按钮。

吐司在单击每个按钮时的行为会有所不同。

前面提到的Toast调用看起来有些冗长。

让我们使用Kotlin扩展程序创建一些动态的Toast消息。

烤面包的Kotlin扩展功能

我们可以通过在Kotlin扩展功能中设置一些默认值来缩短Toast调用。

以下函数是应在我们的MainActivity.kt中使用的扩展函数。

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

我们设置了上下文和持续时间的默认值。
如果调用toast(" Message"),它将触发Toast消息。

" applicationContext"表示应用程序的上下文。
它使烤面包在整个应用程序中可见。
我们始终可以将默认值更改为其他上下文(例如:活动上下文或者Fragment的上下文)。
applicationContext等效于Java中的" getApplicationContext()"。

如何从strings.xml设置toast消息?

字符串资源的类型为Int。
因此,我们需要将参数类型设置为Int。

以下扩展功能显示了如何在Toast上设置strings.xml资源。

fun Context.stringResToast(context: Context = applicationContext, message: Int, toastDuration: Int = Toast.LENGTH_SHORT) {
      Toast.makeText(context, context.getString(message), toastDuration).show()
  }

要触发Toast,我们只需要在活动中将字符串资源传递到函数内部即可。

stringResToast(message = R.string.app_name)

以编程方式创建toast

要以编程方式创建"自定义toast",我们使用自定义布局。

以下是定义的自定义布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/custom_toast_container"
  android:layout_width="match_parent"
  android:layout_height="48dp"
  android:background="#EAA"
  android:orientation="horizontal"
  android:padding="8dp"
  android:weightSum="1">

  <ImageView
      android:id="@+id/imageView"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_marginEnd="8dp"
      android:layout_marginRight="8dp"
      android:layout_weight="0.2" 

  <TextView
      android:id="@+id/textView"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_gravity="center_vertical"
      android:layout_weight="0.8"
      android:textColor="#FFF" 
</LinearLayout>

为了以编程方式实例化Toast,我们执行" val toast = Toast(this)",其中这是" Context"。

toast不是视图。
因此,无法使用" addView()"将其添加到父视图中。
我们需要inflate它们。

以下功能用于以编程方式创建和触发Toast。

fun createCustomToast(message: String, imageSrc: Int) {
      val toast = Toast(this)
      toast.apply {

          val layout = linearLayout.inflate(R.layout.custom_toast_layout)

          layout.textView.text = message
          layout.imageView.setBackgroundResource(imageSrc)
          setGravity(Gravity.CENTER, 0, 0)
          duration = Toast.LENGTH_SHORT
          view = layout
          show()
      }
  }

fun ViewGroup.inflate(@LayoutRes layoutRes: Int, attachToRoot: Boolean = false): View {
      return LayoutInflater.from(context).inflate(layoutRes, this, attachToRoot)
  }

我们创建了一个inflate函数来缩短Toast布局声明。

在apply lambda表达式中,我们使用inflate函数在"活动"的父视图中为布局充气。

另外,我们设置文本,图像资源,持续时间以及Toast的重力。

setGravity要求我们设置重力类型:LEFT,RIGHT,CENTER,CENTER_HORIZONTAL,CENTER VERTICAL。

第二个和第三个参数是屏幕上当前位置的x和y偏移量。

show()函数将Toast触发到屏幕上。

Kotlin Toast代码– MainActivity.kt

下面给出了MainActivity.kt Kotlin类的代码。

package net.androidly.androidlytoasts

import android.content.Context
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.support.annotation.LayoutRes
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.custom_toast_layout.view.*

class MainActivity : AppCompatActivity(), View.OnClickListener {

  override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)

      btnShortToast.setOnClickListener(this)
      btnLongToast.setOnClickListener(this)
      btnCustomToast.setOnClickListener(this)

  }

  override fun onClick(v: View?) {
      when (v?.id) {
          R.id.btnShortToast -> {
              toast(message = "Androidly Short Toasts")
              stringResToast(message = R.string.app_name)
          }
          R.id.btnLongToast -> {
              toast(message = "Androidly Long Toasts", toastDuration = Toast.LENGTH_LONG)
          }
          R.id.btnCustomToast -> {
              createCustomToast(message = "Androidly Custom Toast", imageSrc = R.mipmap.ic_launcher_round)
          }
      }
  }

  fun createCustomToast(message: String, imageSrc: Int) {
      val toast = Toast(this)
      toast.apply {

          val layout = linearLayout.inflate(R.layout.custom_toast_layout)

          layout.textView.text = message
          layout.imageView.setBackgroundResource(imageSrc)
          setGravity(Gravity.CENTER, 0, 0)
          duration = Toast.LENGTH_SHORT
          view = layout
          show()
      }
  }

  fun ViewGroup.inflate(@LayoutRes layoutRes: Int, attachToRoot: Boolean = false): View {
      return LayoutInflater.from(context).inflate(layoutRes, this, attachToRoot)
  }

  fun Context.toast(context: Context = applicationContext, message: String, toastDuration: Int = Toast.LENGTH_SHORT) {
      Toast.makeText(context, message, toastDuration).show()
  }

  fun Context.stringResToast(context: Context = applicationContext, message: Int, toastDuration: Int = Toast.LENGTH_SHORT) {
      Toast.makeText(context, context.getString(message), toastDuration).show()
  }

}

在上面的代码中,我们已经实现了View.OnClickListener接口。

我们使用了when语句来检测单击了哪个按钮。

在"按钮"单击上,我们显示在前面的部分中定义的特定Toast。