You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Android 12中如何修改Toast默认图标?

如何修改Android 12+ Toast的默认图标

嘿,我刚好踩过Android 12 Toast图标的坑,给你两个实用方案,你可以根据需求选:

方案一:自定义Toast布局(最推荐,兼容性拉满)

Android 12开始系统Toast默认绑定应用启动图标,要彻底替换的话,自定义Toast布局是最稳妥的方式——完全可控,还能顺便定制Toast的样式。

步骤1:创建自定义Toast布局

res/layout下新建toast_custom.xml,示例如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/toast_bg" <!-- 可自定义圆角背景 -->
    android:orientation="horizontal"
    android:paddingHorizontal="16dp"
    android:paddingVertical="12dp">

    <ImageView
        android:id="@+id/toast_icon"
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:src="@drawable/your_target_icon" <!-- 替换成你要的图标 -->
        android:layout_marginEnd="12dp"/>

    <TextView
        android:id="@+id/toast_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textColor="@android:color/white"
        android:textSize="14sp"/>
</LinearLayout>

步骤2:编写显示自定义Toast的工具方法

Kotlin版本:

fun showCustomToast(context: Context, message: String) {
    val toast = Toast(context)
    val inflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
    val layout = inflater.inflate(R.layout.toast_custom, null)
    
    // 设置文本
    layout.findViewById<TextView>(R.id.toast_text).text = message
    // 如果需要动态切换图标,这里可以修改ImageView的资源
    // layout.findViewById<ImageView>(R.id.toast_icon).setImageResource(R.drawable.dynamic_icon)
    
    toast.view = layout
    toast.duration = Toast.LENGTH_LONG
    toast.show()
}

Java版本:

public static void showCustomToast(Context context, String message) {
    Toast toast = new Toast(context);
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View layout = inflater.inflate(R.layout.toast_custom, null);
    
    // 设置文本
    TextView textView = layout.findViewById(R.id.toast_text);
    textView.setText(message);
    // 动态换图标
    // ImageView iconView = layout.findViewById(R.id.toast_icon);
    // iconView.setImageResource(R.drawable.dynamic_icon);
    
    toast.setView(layout);
    toast.setDuration(Toast.LENGTH_LONG);
    toast.show();
}

之后直接调用showCustomToast(this, "Show simple toast")就能显示带自定义图标的Toast了。

方案二:反射修改系统Toast图标(备选,兼容性有限)

如果你不想自定义布局,只想修改系统默认Toast的图标,可以用反射的方式,但要注意:这个方法依赖系统内部API,不同厂商ROM或后续Android版本可能失效,建议作为 fallback 方案。

Kotlin示例代码:

fun showToastWithCustomIcon(context: Context, message: String) {
    val toast = Toast.makeText(context, message, Toast.LENGTH_LONG)
    try {
        // 反射获取Toast的内部视图
        val mToastViewField = Toast::class.java.getDeclaredField("mToastView")
        mToastViewField.isAccessible = true
        val toastView = mToastViewField.get(toast) as View

        // 找到系统Toast的图标控件(Android 12中id为com.android.internal.R.id.icon)
        val iconId = Resources.getSystem().getIdentifier("icon", "id", "android")
        val iconView = toastView.findViewById<ImageView>(iconId)
        // 替换图标
        iconView.setImageResource(R.drawable.your_target_icon)
    } catch (e: Exception) {
        // 反射失败时,自动切换到自定义Toast
        showCustomToast(context, message)
    }
    toast.show()
}

注意事项:

  • 反射方法在targetSdkVersion 31+可能遇到权限限制,部分厂商ROM也可能修改了Toast的内部结构,导致找不到图标控件。
  • 自定义Toast虽然多写几行代码,但样式完全由你掌控,适配性更强,优先推荐。

内容的提问来源于stack exchange,提问作者Denis

火山引擎 最新活动