Xamarin Forms中Acr.UserDialogs提示框无法显示在Rg.Plugins.Popup弹窗上层
解决Acr.UserDialogs Toast被Rg.Plugins.Popup遮挡的问题
这个问题我之前也碰到过,核心原因就是层级冲突:Rg的Popup弹窗会占据当前页面的上层渲染优先级,而Acr的Toast默认显示层级不够,就被压在下面了。虽然Xamarin Forms没有像Web那样直接的z-index属性,但我们可以针对不同原生平台调整Toast的原生显示层级,来实现类似的效果,具体方案如下:
1. Android平台调整Toast层级
在Android项目的MainActivity.cs中初始化Acr.UserDialogs时,我们可以自定义Toast的配置,把它的窗口类型设置为更高层级的ApplicationOverlay,确保能覆盖Popup弹窗:
protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); Xamarin.Essentials.Platform.Init(this, savedInstanceState); global::Xamarin.Forms.Forms.Init(this, savedInstanceState); // 初始化UserDialogs并配置Toast层级 UserDialogs.Init(this); var defaultToastConfig = new ToastConfig(string.Empty) { AndroidOptions = new AndroidOptions { // 设置窗口类型为应用覆盖层,优先级高于普通弹窗 WindowType = Android.Views.WindowManagerTypes.ApplicationOverlay, // 可选:调整Toast的显示位置和动画 Gravity = Android.Views.GravityFlags.Bottom | Android.Views.GravityFlags.CenterHorizontal, WindowAnimations = Android.Resource.Animation.SlideUp } }; // 全局设置默认Toast配置 UserDialogs.Instance.ToastConfig = defaultToastConfig; LoadApplication(new App()); }
注意:Android 8.0+需要在AndroidManifest.xml中添加权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
2. iOS平台调整Toast层级
在iOS项目的AppDelegate.cs中,我们可以把Toast的窗口层级设置为UIWindowLevel.Alert + 1,让它的优先级高于普通弹窗(包括Rg的Popup):
public override bool FinishedLaunching(UIApplication app, NSDictionary options) { global::Xamarin.Forms.Forms.Init(); UserDialogs.Init(); // 自定义iOS Toast配置 var defaultToastConfig = new ToastConfig(string.Empty) { IosOptions = new IosOptions { // 设置窗口层级比系统Alert更高,确保覆盖Popup WindowLevel = UIKit.UIWindowLevel.Alert + 1 } }; UserDialogs.Instance.ToastConfig = defaultToastConfig; LoadApplication(new App()); return base.FinishedLaunching(app, options); }
3. 备选方案:临时隐藏Popup(不推荐)
如果上面的层级调整不生效,还有一个临时方案:在显示Toast之前,先隐藏当前的Popup,Toast显示完成后再恢复。但这个方案会打断用户的弹窗操作体验,所以只建议作为最后的备选:
// 显示Toast前隐藏Popup await PopupNavigation.Instance.PopAllAsync(); UserDialogs.Instance.Toast("提示内容"); // 延迟后重新打开Popup(如果需要) await Task.Delay(2000); await PopupNavigation.Instance.PushAsync(new YourPopupPage());
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

