toast.view.background为null时如何自定义Toast背景颜色?

How to customize Toast background color when toast.view.background is null?

在 Toast 的视图背景上设置颜色过滤器似乎是最好的方法。但是 toast.view.backgroundnull 所以 我得到了一个 NPE 并且 setColorFilter() 方法失败了。

fun showToast(context: Context, text: String) {
    val toast = Toast.makeText(context, text, Toast.LENGTH_SHORT)

    // customize background color
    toast.view.background.setColorFilter(
        ContextCompat.getColor(context, R.color.toast_background),
        PorterDuff.Mode.SRC_IN
    )
    toast.show()
}

我还尝试创建一个自定义可绘制对象并将 toast.view.background 设置为可绘制对象,但它显示我的自定义可绘制对象 默认 Toast 背景之后。

view.background = ContextCompat.getDrawable(context, R.drawable.toast_background)

您应该扩充您的自定义视图并通过 setView 将其设置为 toast 视图。如果您只能自定义背景,则可能会导致错误。例如,一些不流行的智能手机型号上的 toast 可能会被白色主题的 toast 覆盖(白色背景,上面有黑色文本)。这是自定义整个 toast 视图的首选方式

您可以创建自定义布局文件并从中扩展。这将使您可以灵活地设置背景和添加更多要查看的小部件。在下面的示例中,我将背景颜色设置为红色,文本颜色设置为白色,但您可以根据需要进行自定义。

  1. 创建 toast_with_custom_view 布局文件并添加以下内容:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@android:color/holo_red_dark"
    android:orientation="vertical">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/white" />
</LinearLayout>
  1. 使用以下代码扩展自定义视图:
private fun showToast() {
    // inflate the custom layout
    val toastView = layoutInflater.inflate(R.layout.toast_with_custom_view, null)
    toastView.findViewById<TextView>(R.id.textView).text = "Hello, world!"

    val toast = Toast(applicationContext)
    // set custom view
    toast.view = toastView
    toast.show()
}