方法 setView 已弃用

Method setView is deprecated

当我在我的应用程序上执行自定义 toast 时,我注意到 setView 已被弃用。

有人对此有解决方案吗?

toast.setView(customView);

由于 setView 已弃用:

This method was deprecated in API level 30. Custom toast views are deprecated. Apps can create a standard text toast with the makeText(android.content.Context, java.lang.CharSequence, int) method, or use a Snackbar when in the foreground. Starting from Android Build.VERSION_CODES#R, apps targeting API level Build.VERSION_CODES#R or higher that are in the background will not have custom toast views displayed.

这是有道理的 Toasts 可以显示在其他应用程序之上,一些应用程序可以通过在其他应用程序之上创建自定义 Toasts 来欺骗用户,即使他们的应用程序在后台也是如此。但是,如果您的应用程序在前台,您的自定义 Toast 仍将显示在所有 Android 个版本中。

在 Toast 上设置自定义视图的解决方案已弃用 API 30 及更高版本。

文档说

This method was deprecated in API level 30. Custom toast views are deprecated. Apps can create a standard text toast with the makeText(android.content.Context, java.lang.CharSequence, int) method, or use a Snackbar when in the foreground. Starting from Android Build.VERSION_CODES#R, apps targeting API level Build.VERSION_CODES#R or higher that are in the background will not have custom toast views displayed.

虽然有一些情况的解决方法

Toast.makeText(applicationContext,
                HtmlCompat.fromHtml("<font color='red'>custom toast message</font>", HtmlCompat.FROM_HTML_MODE_LEGACY),
                Toast.LENGTH_LONG).show()

Html颜色标签也可以是<font color='#ff6347'>

对于每一个与显示文本有关的修改,上面的解决方案就足够了。例如,您可以通过插入 <b>my text</b> 使文本 加粗 ,或者您可能想将 font-family 更改为 <font font-family='...'> my text </font> 对于所有这些更改,解决方案就足够了。

如果您想使用 background-color 等属性修改容器,唯一的选择是使用 Snackbar。无法再为 Toast 修改视图。

由于其他答案已经提到了使用 snackbar/deafult toast 的原因,我将提供我使用的替代方法。

我们可能无法自定义 toast 背景,但我们可以使用 Spannable string 自定义 toast 中显示的文本。将显示默认的 toast 背景,但使用包下可用的不同跨度样式:android.text.style,我们可以在 toast 消息中实现自定义文本样式。

自定义 toast 示例,其中文本颜色为绿色,文本大小为 200 像素。

val spannableString = SpannableString("Custom toast")
spannableString.setSpan(
    ForegroundColorSpan(Color.GREEN), 0, spannableString.length, 0
)
spannableString.setSpan(
    AbsoluteSizeSpan(200), 0, spannableString.length, 0
)
val toast = Toast.makeText(context, spannableString, Toast.LENGTH_SHORT)
toast.show()

可生成的字符串参考:spantastic text styling with spans

(PS:当应用 运行 或自定义通知向用户显示重要消息时,我们始终可以显示自定义对话框。)