如何以 xamarin 形式在屏幕顶部显示小吃店或烤面包

Posted

技术标签:

【中文标题】如何以 xamarin 形式在屏幕顶部显示小吃店或烤面包【英文标题】:How to display a snackbar or toast at top of the screen in xamarin forms 【发布时间】:2021-10-16 11:17:03 【问题描述】:

我在 xamarin 项目中实现了snackbar。 但我需要在屏幕顶部显示该小吃栏。

代码:

SnackBarOptions options = new SnackBarOptions

    MessageOptions = new MessageOptions
    
        Foreground = Color.Black,
        Message = toastMsg,
        Padding= 15
        
    ,
    BackgroundColor = Color.White,
    Duration = TimeSpan.FromSeconds(8),
    CornerRadius = 15,
    IsRtl = true,
    
    
;
Application.Current.MainPage.DisplaySnackBarAsync(options);

【问题讨论】:

【参考方案1】:

您需要编写自定义平台特定代码来实现此目的:

安卓:


    GradientDrawable shape = new GradientDrawable();
    shape.SetCornerRadius(15); //For Corner radius
    shape.SetColor(android.Graphics.Color.Black);
    var contentView = Xamarin.Essentials.Platform.CurrentActivity?.FindViewById(Android.Resource.Id.Content);
    Snackbar snackBar = Snackbar.Make(contentView, "Your Message", 5000);
    Android.Views.View view = snackBar.View;
    view.SetBackground(shape);
    FrameLayout.LayoutParams frameLayout = (FrameLayout.LayoutParams)view.LayoutParameters;
    frameLayout.Gravity = GravityFlags.Top;
    view.LayoutParameters = frameLayout;
    snackBar.Show();

【讨论】:

我需要在 ios 和 Android 中都显示 @Himanshu Dwivedi 有任何文章可以实现自定义 toast 消息 @Priyanka 你可以使用包含iOS平台snackbar实现的Xamarin.Essential工具包代码,并将Constraint设置为Top (NSLayoutConstraint) Toast 实现文章:c-sharpcorner.com/article/xamarin 如果这对你有用,请投票 snackbar 显示全屏宽度。 frameLayout.SetMargins(20, 30, 20, 20);无法正常工作。 而且我也无法提供圆角半径@Hinamshu Dwivedi【参考方案2】:

是的,您可以使用Xamarin.Forms DependencyService 来实现。

请参考以下代码:

1.在表单中创建接口IToast

public interface IToast

    void Show(string message);

2.在android中,创建类Toast_Android来实现接口IToast,并将重力设置为GravityFlags.Top

[assembly: Xamarin.Forms.Dependency(typeof(Toast_Android))]
namespace ToastApp.Droid

    public class Toast_Android : IToast
    
        public void Show(string message)
        
            Toast toast = Toast.MakeText(Android.App.Application.Context, message, ToastLength.Long);
            View view = toast.View;
            view.SetBackgroundColor(Color.Yellow);
            TextView text = (TextView)view.FindViewById(Android.Resource.Id.Message);
            text.SetTextColor(Color.Red);
            toast.SetGravity(GravityFlags.Top, 0, 0);
            toast.Show();
        
    

注意:

3.在ios中,创建类Toast_IOS来实现接口IToast并设置视图的位置:

[assembly: Xamarin.Forms.Dependency(typeof(Toast_IOS))]
namespace ToastApp.iOS

    public class Toast_IOS : IToast
    
        const double LONG_DELAY = 3.5;
        NSTimer alertDelay;
        UIViewController alert;

        const float DialogWith = 160;

        public void Show(string message)
        
            ShowAlert(message, LONG_DELAY);
        

        void ShowAlert(string message, double seconds)
        
            alertDelay = NSTimer.CreateScheduledTimer(seconds, (obj) =>
            
                dismissMessage();
            );
            alert = new UIViewController();

            UILabel view = new UILabel();
            int  DeviceWidth = (int)UIScreen.MainScreen.Bounds.Width;

            float position = (DeviceWidth - DialogWith) / 2;

            view.Frame = new CoreGraphics.CGRect(position, 0, DialogWith, 100);
            view.Text = message;

           // you can customize  the style as you want
            view.TextColor = UIColor.Red;
            view.BackgroundColor = UIColor.Yellow;

            alert.View.Add(view);
                UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(alert, true, null);
        
        void dismissMessage()
        
            if (alert != null)
            
                alert.DismissViewController(true,null);
            
            if (alertDelay != null)
            
                alertDelay.Dispose();
            
        
    

【讨论】:

张如何使用这些自定义类设置背景颜色和文本颜色 在 ios 中可以随意改变背景颜色和文字颜色,例如:view.TextColor = UIColor.Red; view.BackgroundColor = UIColor.Yellow; 张我需要更改Android toast消息txt颜色并且还需要提供圆角半径。 我已经更新了我的答案,你可以检查一下。 Zhang 如何在 toast 内部提供 padding 以及给 toast 提供圆角半径

以上是关于如何以 xamarin 形式在屏幕顶部显示小吃店或烤面包的主要内容,如果未能解决你的问题,请参考以下文章

如何创建显示在所有屏幕上的小吃店?

如何以 xamarin 形式绘制图像?

如何在顶部显示 Flutter SnackBar 小部件?

有没有办法获得被推送的路线的上下文以在其中显示小吃店?

如何将默认的小吃店动画更改为“从顶部到按钮”?

我们如何以xamarin形式隐藏详细信息页面上的标签?