方法 Toast.setView 已被弃用。

14

在我的应用程序中进行自定义toast时,我注意到setView已经被弃用了。

Code Screenshot

有人对这个问题有解决方案吗?
toast.setView(customView);

我刚刚在AOSP源代码(实际上是Android Code Search网站)上进行了一些挖掘,并找到了标记Toast#setView为弃用的更改(甚至解释了更改背后的原理):https://cs.android.com/android/_/android/platform/frameworks/base/+/7b843abc1c7cd53096557909f31216b93c3ca674 - Edric
我相信谷歌废弃某些东西是有合理的原因的。使用Snackbar作为替代方案并不是一个真正的选择。Snackbar需要创建和显示视图,但在某些情况下,视图不容易访问,而上下文更容易获取。 - MeLean
4个回答

12

由于setView已过时:

此方法在API级别30中已弃用。 自定义Toast视图已被弃用。应用程序可以使用makeText(android.content.Context, java.lang.CharSequence, int)方法创建标准文本Toast,或在前台使用Snackbar。从Android Build.VERSION_CODES#R开始,针对API级别Build.VERSION_CODES#R或更高版本的后台应用程序将不显示自定义Toast视图。

这是有道理的,Toast可以显示在其他应用程序的顶部,一些应用程序可以通过在其他应用程序顶部创建自定义Toast来欺骗用户以获取他们的利益,即使他们的应用程序在后台运行。但如果您的应用程序在前台,您的自定义Toast仍将在所有Android版本中显示。


1
是的,但它仍然已被弃用,这意味着它将在未来某个时候被移除。那么有什么替代方案吗?我不明白为什么我们不能在应用程序在前台时创建自定义Toast。 - Big_Chair
使用Snackbar实现 @Big_Chair - Xenolion
2
Snackbars和Toasts在我看来是非常不同的东西。 - Marty Miller

2

在API 30及以上版本中,使用自定义视图设置Toast的解决方案已被弃用。

文档说明如下:

此方法在API 30级别中已过时。自定义Toast视图已被弃用。应用程序可以使用makeText(android.content.Context, java.lang.CharSequence, int)方法创建标准文本Toast,或在前台时使用Snackbar。从Android Build.VERSION_CODES#R开始,针对Build.VERSION_CODES#R或更高版本的API级别进行目标定位且处于后台的应用程序将不会显示自定义Toast视图。

尽管如此,在某些情况下还是有解决方法的。

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 font-family='...'> my text </font>更改字体族。对于所有这些更改,该解决方案将足够。

如果您想要修改容器的属性,如background-color,唯一的选择是使用Snackbar。Toast不能再用于修改视图。


1
作为其他答案已经提到了使用snackbar/deafult toast的原因,我将提供我使用的替代方案。
我们可能无法自定义toast背景,但我们可以使用Spannable string来自定义toast中显示的文本。默认的toast背景将被显示,但是使用可用于包:android.text.style下的不同span样式,我们可以在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()

可跨度字符串参考:使用跨度进行漂亮的文本样式设置

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


0
我编写了一个短小的 Kotlin 扩展函数,使用 spannable 来完成这个操作。请注意,它返回一个 toast,您需要“显示”它。
fun Context.spToPix(sp: Int): Int =
    (sp * Resources.getSystem().displayMetrics.scaledDensity).toInt()
fun Context.fontSizeToast(
    fontSize: Int,
    mess: String,
    displayTime: Int = Toast.LENGTH_LONG
): Toast {
    val ssMess = SpannableString(mess)
    ssMess.setSpan(
        AbsoluteSizeSpan(spToPix(fontSize)),
        0, ssMess.length, 0
    )
    return Toast.makeText(this, ssMess, displayTime)
}

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