Toast.setView(view)
在 Android API 30 中已弃用。建议的替代品是 Material 库中的 Snackbar。
使用Toast.setView(),我们可以设置包含图像的自定义视图,为用户提供非常好的短信体验。我在游戏中使用它取得了良好的效果。 Toast 还允许您设置 Toast 的重力,将其放置在屏幕上与您的应用程序相关的位置。
虽然(从 Android API 34 开始)我们仍然可以使用 Toast.setView(),但它已被弃用,这意味着它将在未来的某个时候被删除。
所以我想知道什么是可行的类似替代品?
吐司允许:
Snackbar(推荐更换)提供:
对话框(可能替换)
以上 2 个选项都效果不佳。 Snackbar 根本就不是,对话框抓取用户输入将提供真的很差的用户体验。
这里有讨论方法Toast.setView已弃用但没有解决方案。
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() 的行为,同时允许自定义视图和定位的灵活性。