【问题标题】:Method setView is deprecated方法 setView 已弃用
【发布时间】:2020-11-28 09:51:57
【问题描述】:

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

有人对此有解决方案吗?

toast.setView(customView);

【问题讨论】:

  • 我刚刚对 AOSP 源代码(嗯,Android Code Search 网站)进行了一些挖掘,发现将 Toast#setView 标记为已弃用的更改(甚至解释了更改背后的理由):@ 987654323@
  • 我很确定 Google 有合理的理由来弃用这些东西。使用 Snackbar 的替代方案不是一个真正的选择。 Snackbar 需要创建和显示一个视图,但在某些情况下,视图并不容易访问,而是上下文。

标签: java android android-toast


【解决方案1】:

由于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 可以显示在其他应用程序之上,一些应用程序可以通过在其他应用程序之上创建自定义 Toasts 来欺骗用户,即使他们的应用程序在后台也是如此。但如果您的应用位于前台,您的自定义 Toast 仍将显示在所有 Android 版本中。

【讨论】:

  • 是的,但它仍然被弃用,这意味着它会在未来的某个时候被删除。那么有什么选择呢?我不明白为什么当我们的应用程序在在前台时我们不能创建自定义 toast。
  • 为 @Big_Chair 使用 SnackBars
【解决方案2】:

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

文档说

此方法在 API 级别 30 中已弃用。自定义 toast 视图是 已弃用。 应用可以使用 makeText(android.content.Context, java.lang.CharSequence, int) 方法, 或者在前台使用 Snackbar。从安卓开始 Build.VERSION_CODES#R,面向 API 级别的应用 Build.VERSION_CODES#R 或更高版本的后台将没有自定义 toast 视图 显示出来。

在某些情况下有一个解决方法

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

html颜色标签也可以是&lt;font color='#ff6347'&gt;

对于与显示文本有关的每次修改,上述解决方案就足够了。例如,您可以通过插入 &lt;b&gt;my text&lt;/b&gt; 使文本 bold 或者您可能想用 &lt;font font-family='...'&gt; my text &lt;/font&gt; 更改 font-family 对于所有这些更改,解决方案就足够了.

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

【讨论】:

    【解决方案3】:

    正如其他答案已经提到的原因和使用snackbar/deafult toast,我将提供我使用的替代方案。

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

    自定义 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:我们总是可以在应用程序运行时显示自定义对话框或自定义通知以向用户显示重要消息。)

    【讨论】:

      【解决方案4】:

      来自docs:

      不推荐使用自定义 toast 视图。应用程序可以创建标准文本 使用 makeText(android.content.Context, java.lang.CharSequence, int) 方法吐司,或者在 前景。从Android Build.VERSION_CODES#R开始,apps 针对 API 级别 Build.VERSION_CODES#R 或更高级别的 背景不会显示自定义 toast 视图。

      因此,您不能再将自定义视图设置为 Toast。

      【讨论】:

      • 那么有什么替代方案?
      • 你们找到替代品了吗?
      • toast.addCallback() 方法是如何工作的?
      • @MohitLakhanpal 检查我的答案stackoverflow.com/a/66461542/7237884
      • 这是一个重复的答案。上面的答案已经提到了步骤。
      猜你喜欢
      • 2016-06-08
      • 2012-09-20
      • 1970-01-01
      • 2012-03-04
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 2015-09-19
      相关资源
      最近更新 更多