服了,Toast都被Rom影响了
由于开发过程中,使用Toast时,总是看到消息的前面加上了app_name:消息,刚开始还以为是程序本来如此,后来才发现,有可能是手机Rom的问题。
通过以下的操作,就能覆盖Rom定制过的影响。
val toast = Toast.makeText(context, text, Toast.LENGTH_SHORT)
toast.setText(text)
toast.show()
fun showText(context: Context, text: String) {
if (text.isEmpty()) {
return
}
if (oldMsg.isEmpty()) {
val toast = Toast.makeText(context, text, Toast.LENGTH_SHORT)
toast.setText(text)
toast.show()
oldMsg = text
oneTime = System.currentTimeMillis()
} else {
twoTime = System.currentTimeMillis()
if (twoTime - oneTime > 2000) {
val toast = Toast.makeText(
context,
text,
Toast.LENGTH_SHORT
)
toast.setText(text)
toast.show()
oneTime = twoTime
oldMsg = text
} else {
if (oldMsg != text) {
val toast = Toast.makeText(
context,
text,
Toast.LENGTH_SHORT
)
toast.setText(text)
toast.show()
oneTime = twoTime
}
}
}
}
还有Rom定制带上appIcon的情况
国产手机有些部分会定制Rom中修改Toast的样式,只要setText覆盖就行
原来是Android 12以上系统更改了。
Android 12 及更高版本的系统强制行为:从 Android 12(API 31)开始,Google 改变了 Toast 的样式。为了统一用户体验,系统强制在文本左侧显示当前应用的图标,这是默认行为,无法通过简单的系统设置或原生 API 移除.
国产 ROM 的系统级修改:一些国产手机厂商(如小米、华为等)会对 Android 系统进行深度定制。它们可能会在系统层面上修改 Toast 的显示逻辑,比如默认就加上应用图标,或者允许用户/系统在某些情况下自动添加图标,导致看起来像是“自带”的。
一个简单的Toast,非得有不同的手机设备表现不一致,难绷呀!
deepseek提供的方案:
由于这是系统级别的行为,无法通过修改 Toast.makeText() 的代码来移除。最直接有效的方法是使用第三方工具库来接管 Toast 的创建和显示。
-
推荐方案:使用轻量级第三方库
目前比较优秀的方案是使用专门设计的 Toast 库,例如搜索结果中提到的 NexToast。这类库通过系统级代理机制,可以在不同 Android 版本和厂商系统上实现一致的 Toast 效果。-
核心优势:
-
移除图标:能够强制移除 Android 12+ 上的应用图标;
-
高度自定义:可以轻松修改文本颜色、大小、背景等,甚至可以获取到内部的
TextView进行精细控制; -
轻量兼容:体积小巧(如 3KB),并经过了全机型验证,能较好地兼容不同系统。
-
dependencies {
implementation 'io.github.justlikecheese.nextoast:NexToast:1.2.2'
}
之后将代码中的 Toast.makeText(...).show() 替换为 NexToast.makeText(...).show() 就能看到效果。
测试后整理结果
val toast = NexToast.makeText(
context,
text,
NexToast.LENGTH_SHORT
)
toast.setText(text)//移除Android 12- 可能拼接的appName
toast.show()