android 方法吐司已弃用

bbmckpt7  于 2023-03-28  发布在  Android
关注(0)|答案(4)|浏览(332)

当我在我的应用程序上做自定义吐司时,我注意到setView已被弃用。

有人能解决这个问题吗?

toast.setView(customView);
xoefb8l8

xoefb8l81#

由于setView已弃用:
此方法在API级别30中已弃用。自定义吐司视图已弃用。应用可以使用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版本中。

0x6upsns

0x6upsns2#

在吐司上设置自定义视图的解决方案不适用于API 30及以后版本。
文件上说
此方法在API级别30中已弃用。自定义吐司视图已弃用。应用可以使用makeText(android.content.Context,java.lang.CharSequence,int)方法创建标准文本toast,或在前台使用小吃条。从Android Build.VERSION_CODES#R开始,面向API级别Build.VERSION_CODES#R或更高级别的应用在后台将不会显示自定义toast视图。
有一个walkaround为某些情况下虽然

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>更改font-family对于所有这些更改,该解决方案就足够了。
如果你想修改容器的属性,比如background-color,唯一的选择就是使用Snackbar。视图不能再为吐司修改。

scyqe7ek

scyqe7ek3#

由于其他答案已经提到了原因,并使用snackbar/deafult吐司,我将提供我使用的替代方案。
我们可能无法自定义吐司背景,但我们可以使用Spannable string来自定义toast中显示的文本。将显示默认的toast背景,但使用package下提供的不同span样式:android.text.style,我们可以实现自定义文本样式的吐司消息。
示例自定义吐司,显示文本颜色为绿色且文本大小为200像素的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()

可跨越的字符串引用:spantastic text styling with spans
(PS:我们可以在应用程序运行时始终显示自定义对话框或自定义通知,以向用户显示重要消息。

gj3fmq9x

gj3fmq9x4#

我写了一个简短的Kotlin扩展函数来使用spannable来实现这一点。注意,它返回一个你需要“显示”的吐司。

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)
}

相关问题