从前台 Activity 替换 Toast.setView()

问题描述 投票:0回答:1

Toast.setView(view)
在 Android API 30 中已弃用。建议的替代品是 Material 库中的 Snackbar。

使用Toast.setView(),我们可以设置包含图像的自定义视图,为用户提供非常好的短信体验。我在游戏中使用它取得了良好的效果。 Toast 还允许您设置 Toast 的重力,将其放置在屏幕上与您的应用程序相关的位置。

虽然(从 Android API 34 开始)我们仍然可以使用 Toast.setView(),但它已被弃用,这意味着它将在未来的某个时候被删除。

所以我想知道什么是可行的类似替代品?

吐司允许:

  • 自定义视图
  • 在屏幕上定位
  • 无用户交互
  • 自动消失

Snackbar(推荐更换)提供:

  • 没有自定义视图
  • 无屏幕定位
  • 无用户交互
  • 自动消失

对话框(可能替换)

  • 自定义视图
  • 屏幕定位
  • 捕获用户输入,遮挡其下方的 Activity
  • 需要代码才能自动关闭

以上 2 个选项都效果不佳。 Snackbar 根本就不是,对话框抓取用户输入将提供真的很差的用户体验。

这里有讨论方法Toast.setView已弃用但没有解决方案。

android toast
1个回答
0
投票

Toast.setView() 的弃用确实带来了挑战,特别是当您需要将自定义视图显示为 Toast 消息时。由于推荐的 Snackbar 不支持自定义视图或定位,并且对话框可能会干扰用户交互,因此我们需要一种替代方法。

这是一个使用 PopupWindow 的解决方案,它允许自定义视图、定位和自动关闭,无需用户交互

:: 示例::

为吐司创建自定义布局

<!-- res/layout/custom_toast.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/custom_toast_background"
    android:padding="8dp"
    android:orientation="horizontal"
    android:gravity="center">

    <ImageView
        android:id="@+id/toast_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/your_image" />

    <TextView
        android:id="@+id/toast_text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Your message"
        android:paddingStart="8dp"
        android:textColor="@android:color/white" />
</LinearLayout>

使用 PopupWindow 显示自定义 toast

创建一个实用函数来显示自定义 toast。

public class CustomToast {

    public static void showCustomToast(Context context, View anchorView, String message, int duration) {
        // Inflate custom toast layout
        LayoutInflater inflater = LayoutInflater.from(context);
        View toastView = inflater.inflate(R.layout.custom_toast, null);

        // Set the text for the TextView in the custom toast layout
        TextView toastText = toastView.findViewById(R.id.toast_text);
        toastText.setText(message);

        // Create the PopupWindow
        final PopupWindow popupWindow = new PopupWindow(toastView, 
                ViewGroup.LayoutParams.WRAP_CONTENT, 
                ViewGroup.LayoutParams.WRAP_CONTENT, 
                false);

        // Set a dismiss timer
        new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
            @Override
            public void run() {
                if (popupWindow.isShowing()) {
                    popupWindow.dismiss();
                }
            }
        }, duration);

        // Show the PopupWindow at desired position
        popupWindow.showAtLocation(anchorView, Gravity.CENTER, 0, 0);
    }
}

用法

从 Activity 或 Fragment 中调用 showCustomToast 方法来显示自定义 toast。

CustomToast.showCustomToast(this, findViewById(android.R.id.content), "Your custom message", 3000);

此解决方案应该密切模仿 Toast.setView() 的行为,同时允许自定义视图和定位的灵活性。

© www.soinside.com 2019 - 2024. All rights reserved.