由于setView
已过时:
此方法在API级别30中已弃用。 自定义Toast视图已被弃用。应用程序可以使用
makeText(android.content.Context, java.lang.CharSequence, int)
方法创建标准文本Toast,或在前台使用Snackbar
。从AndroidBuild.VERSION_CODES#R
开始,针对API级别Build.VERSION_CODES#R
或更高版本的后台应用程序将不显示自定义Toast视图。
这是有道理的,Toast可以显示在其他应用程序的顶部,一些应用程序可以通过在其他应用程序顶部创建自定义Toast来欺骗用户以获取他们的利益,即使他们的应用程序在后台运行。但如果您的应用程序在前台,您的自定义Toast仍将在所有Android版本中显示。
在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不能再用于修改视图。
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()
可跨度字符串参考:使用跨度进行漂亮的文本样式设置
(附注:当应用程序正在运行时,我们始终可以显示自定义对话框或自定义通知,以向用户显示重要消息。)
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)
}
Toast#setView
为弃用的更改(甚至解释了更改背后的原理):https://cs.android.com/android/_/android/platform/frameworks/base/+/7b843abc1c7cd53096557909f31216b93c3ca674 - Edric