জামারিন ফর্মগুলির জন্য টোস্ট সমতুল্য


90

টোস্টের সাথে অ্যান্ড্রয়েডের মতো পপ-আপ করার জন্য জামারিন ফর্মগুলি (অ্যান্ড্রয়েড বা আইওএস নির্দিষ্ট নয়) ব্যবহার করার কোনও উপায় আছে, যার কোনও ব্যবহারকারীর ইন্টারঅ্যাকশন প্রয়োজন নেই এবং একটি (সংক্ষিপ্ত) সময়ের পরে চলে যায়?

আমি যা দেখছি তার চারপাশে অনুসন্ধান করা থেকে সতর্কতা হ'ল দূরে যাওয়ার জন্য ব্যবহারকারী ক্লিকের প্রয়োজন।

উত্তর:


171

এর জন্য একটি সহজ সমাধান রয়েছে। ডিপেন্ডেনসি সার্ভিস ব্যবহার করে আপনি সহজেই অ্যান্ড্রয়েড এবং আইওএস উভয় টোস্টের মতো পদ্ধতির পেতে পারেন।

আপনার সাধারণ প্যাকেজে একটি ইন্টারফেস তৈরি করুন।

public interface IMessage
{
    void LongAlert(string message);
    void ShortAlert(string message);
}

অ্যান্ড্রয়েড বিভাগ

[assembly: Xamarin.Forms.Dependency(typeof(MessageAndroid))]
namespace Your.Namespace
{
    public class MessageAndroid : IMessage
    {
        public void LongAlert(string message)
        {
            Toast.MakeText(Application.Context, message, ToastLength.Long).Show();
        }

        public void ShortAlert(string message)
        {
            Toast.MakeText(Application.Context, message, ToastLength.Short).Show();
        }
    }
}

আইওএস বিভাগ

আইওগুলিতে টোস্টের মতো কোনও নেটিভ সমাধান নেই, সুতরাং আমাদের নিজস্ব পদ্ধতির প্রয়োগ করতে হবে।

[assembly: Xamarin.Forms.Dependency(typeof(MessageIOS))]
namespace Bahwan.iOS
{
    public class MessageIOS : IMessage
    {
        const double LONG_DELAY = 3.5;
        const double SHORT_DELAY = 2.0;

        NSTimer alertDelay;
        UIAlertController alert;

        public void LongAlert(string message)
        {
            ShowAlert(message, LONG_DELAY);
        }
        public void ShortAlert(string message)
        {
            ShowAlert(message, SHORT_DELAY);
        }

        void ShowAlert(string message, double seconds)
        {
            alertDelay = NSTimer.CreateScheduledTimer(seconds, (obj) =>
            {
                dismissMessage();
            });
            alert = UIAlertController.Create(null, message, UIAlertControllerStyle.Alert);
            UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(alert, true, null);
        }

        void dismissMessage()
        {
            if (alert != null)
            {
                alert.DismissViewController(true, null);
            }
            if (alertDelay != null)
            {
                alertDelay.Dispose();
            }
        }
    }
}

দয়া করে নোট করুন যে প্রতিটি প্ল্যাটফর্মে, আমাদের ক্লাসগুলি নির্ভরশীলতা পরিষেবাতে নিবন্ধ করতে হবে।

এখন আপনি আমাদের প্রকল্পের যে কোনও জায়গায় টোস্ট পরিষেবা অ্যাক্সেস করতে পারেন।

DependencyService.Get<IMessage>().ShortAlert(string message); 
DependencyService.Get<IMessage>().LongAlert(string message);

20
এটি এখন পর্যন্ত এই প্রশ্নের সেরা উত্তর। কোনও তৃতীয় পক্ষের প্লাগইন বা লাইব্রেরির প্রয়োজন নেই।
ব্রেট ফ্যালার

4
ডিপেন্ডেনসি সার্ভিস লাইনে আমি "অবজেক্ট রেফারেন্স কোনও অবজেক্টের উদাহরণে সেট করা নেই" পেয়ে যাচ্ছি।
জয়েস ডি ল্যান্না

4
হ্যাঁ এটি এখনও অবধি সেরা উত্তর, আমি নির্ভরতা পরিষেবা পছন্দ করি
লুতায়েয়া হুজাইফাহ ইদ্রিস

4
জয়ের পূর্ণ। আপনারও কি এর ইউডাব্লুপি সংস্করণ রয়েছে?
নিমিনেন

4
@ মেনগটিমে আমি প্রতিবার একটি নতুন সতর্কতা এবং টাইমার তৈরি করে আটকে থাকা ইউআই ঠিক করেছি বলে মনে হচ্ছে। উভয় পাস করা প্রয়োজন DismissMessage
আয়ান ওয়ারবার্টন

14

এখানে অ্যালেক্স চেনগালানের আইওএস কোডের একটি সংস্করণ যা একাধিক বার্তা দেখানো হয় তখন UI স্টিক করা এড়ায় ...

public class MessageIOS : IMessage
    {
        const double LONG_DELAY = 3.5;
        const double SHORT_DELAY = 0.75;

        public void LongAlert(string message)
        {
            ShowAlert(message, LONG_DELAY);
        }

        public void ShortAlert(string message)
        {
            ShowAlert(message, SHORT_DELAY);
        }

        void ShowAlert(string message, double seconds)
        {
            var alert = UIAlertController.Create(null, message, UIAlertControllerStyle.Alert);

            var alertDelay = NSTimer.CreateScheduledTimer(seconds, obj =>
            {
                DismissMessage(alert, obj);
            });

            UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(alert, true, null);
        }

        void DismissMessage(UIAlertController alert, NSTimer alertDelay)
        {
            if (alert != null)
            {
                alert.DismissViewController(true, null);
            }

            if (alertDelay != null)
            {
                alertDelay.Dispose();
            }
        }
    }

11

আপনি নীচের মত নুগেট এবং কোড থেকে অ্যাকার ইউজারডায়ালগ প্যাকেজটি ব্যবহার করতে পারেন,

Acr.UserDialogs.UserDialogs.Instance.Toast(Message, new TimeSpan(3));

9

আমরা সাধারণত এগারস টোস্ট প্লাগইন ব্যবহার করতাম, তবে এটির বর্তমান প্রকল্পের জন্য আইওএসের অনুমতির প্রয়োজন হওয়ায় আমরা আরজি.প্লাগিনস.পপআপ নুগেট ( https://github.com/rotorgames/Rg.Plugins.Popup) ব্যবহার করে ভিন্ন পথে চলেছি )।

আমি পপআপপেজ টাইপের একটি বেসিক xaml / cs পৃষ্ঠা লিখেছি,

<?xml version="1.0" encoding="utf-8" ?>
<popup:PopupPage xmlns="http://xamarin.com/schemas/2014/forms"
         xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
         xmlns:popup="clr-namespace:Rg.Plugins.Popup.Pages;assembly=Rg.Plugins.Popup"
         x:Class="YourApp.Controls.ToastPage">
...

এবং এটি কোনও পরিষেবা দ্বারা তৈরি করা হয়েছে, যার ইন্টারফেসটি আপনি অ্যাপ্লিকেশন শুরুতে নিবন্ধভুক্ত করেন বা পরিষেবাটি আনার জন্য Xamarin.Forms.D dependencyService ব্যবহার করেন তা কার্যকরও হবে।

পরিষেবাটি পপআপপেজ ডাইরেক্ট পৃষ্ঠায় খবর দেয় এবং তা করে

await PopupNavigation.PushAsync(newToastPage);
await Task.Delay(2000);
await PopupNavigation.PopAllAsync();

পপআপ পৃষ্ঠাটি ব্যবহারকারী পৃষ্ঠার প্রদর্শনের বাইরে আলতো চাপ দিয়ে বরখাস্ত করতে পারে (ধরে নিলে এটি স্ক্রিনটি পূরণ করে নি)।

এটি আইওএস / ড্রয়েডে সুখে কাজ করছে বলে মনে হচ্ছে, তবে কেউ যদি জেনে থাকে যে এটি করা ঝুঁকিপূর্ণ উপায়।


আরজি পপআপগুলি দুর্দান্ত। পূর্ণ পৃষ্ঠাতে প্রদর্শন বা ক্রিয়াকলাপ সূচক লোড করার জন্য আমি একই রকম কাজ করি। অন্যান্য প্লাগইনগুলির সমস্যা হ'ল তারা এ্যাসিঙ্ক ফাংশন এবং মূল থ্রেডের উপর নির্ভরশীল তবে আরজি পপআপ ২ য় থ্রেডে চলতে পারে যা এটি খুব দরকারী। সত্যিই ভাল ধারণা তবে আমি অ্যান্ড্রয়েড টোস্টের মতো দেশীয় দেখতে চাই have
এমিল

এখন অবধি ক্রস প্ল্যাটফর্ম টোস্ট করার সর্বোত্তম পদ্ধতি। আরজি.পপআপটি অত্যন্ত নমনীয় এবং আমি প্রায় প্রতিটি প্রকল্পে এটি ব্যবহার করি। টোস্টগুলি প্রদর্শনের জন্য অন্য প্লাগইন বা প্ল্যাটফর্ম কোড ব্যবহার করার দরকার নেই,
জিম্পাওলো গাব্বা

8

অ্যালেক্সের উত্তরে যুক্ত করা, এখানে ইউডাব্লুপি বৈকল্পিক:

public class Message : IMessage {
  private const double LONG_DELAY = 3.5;
  private const double SHORT_DELAY = 2.0;

  public void LongAlert(string message) =>
    ShowMessage(message, LONG_DELAY);

  public void ShortAlert(string message) =>
    ShowMessage(message, SHORT_DELAY);

  private void ShowMessage(string message, double duration) {
    var label = new TextBlock {
      Text = message,
      Foreground = new SolidColorBrush(Windows.UI.Colors.White),
      HorizontalAlignment = HorizontalAlignment.Center,
      VerticalAlignment = VerticalAlignment.Center,
    };
    var style = new Style { TargetType = typeof(FlyoutPresenter) };
    style.Setters.Add(new Setter(Control.BackgroundProperty, new SolidColorBrush(Windows.UI.Colors.Black)));
    style.Setters.Add(new Setter(FrameworkElement.MaxHeightProperty, 1));
    var flyout = new Flyout {
      Content = label,
      Placement = FlyoutPlacementMode.Full,
      FlyoutPresenterStyle = style,
    };

    flyout.ShowAt(Window.Current.Content as FrameworkElement);

    var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(duration) };
    timer.Tick += (sender, e) => {
      timer.Stop();
      flyout.Hide();
    };
    timer.Start();
  }
}

রঙ এবং স্টাইলিং আপনার উপর নির্ভর করে MaxHeight, প্রকৃতপক্ষে উচ্চতা সর্বনিম্ন রাখতে হবে।


সুতরাং এটি নির্ভরশীল পরিষেবা হিসাবে নিবন্ধন করার জন্য ইউডাব্লুপি'র প্রয়োজন নেই?
ওলরুনফেমি আজিবুলু

এটি অন্য দুটি রূপের মতো কাজ করে। হ্যাঁ, একটি নির্ভরতা পরিষেবা।
গ্যাবার

7

আপনি IUserDialog ব্যবহার করতে পারেন NuGet কেবল এটা toastAlert ব্যবহার

var toastConfig = new ToastConfig("Toasting...");
toastConfig.SetDuration(3000);
toastConfig.SetBackgroundColor(System.Drawing.Color.FromArgb(12, 131, 193));

UserDialogs.Instance.Toast(toastConfig);

4

এখানে একটি কোড স্নিপেট যা আমি Xamarin.iOS এ টোস্টটি দেখানোর জন্য ব্যবহার করছি

  public void ShowToast(String message, UIView view)
    {
        UIView residualView = view.ViewWithTag(1989);
        if (residualView != null)
            residualView.RemoveFromSuperview();

        var viewBack = new UIView(new CoreGraphics.CGRect(83, 0, 300, 100));
        viewBack.BackgroundColor = UIColor.Black;
        viewBack.Tag = 1989;
        UILabel lblMsg = new UILabel(new CoreGraphics.CGRect(0, 20, 300, 60));
        lblMsg.Lines = 2;
        lblMsg.Text = message;
        lblMsg.TextColor = UIColor.White;
        lblMsg.TextAlignment = UITextAlignment.Center;
        viewBack.Center = view.Center;
        viewBack.AddSubview(lblMsg);
        view.AddSubview(viewBack);
        roundtheCorner(viewBack);
        UIView.BeginAnimations("Toast");
        UIView.SetAnimationDuration(3.0f);
        viewBack.Alpha = 0.0f;
        UIView.CommitAnimations();
    }

4

আমি Plugin.Toastলাইব্রেরি সুপারিশ করব nuget। এটা ভাল কাজ করে.

CrossToastPopUp.Current.ShowToastMessage("my toast message");

বা ACR.UserDialogs থেকে নিউট লাইব্রেরি

UserDialogs.Instance.ShowLoading("Loading");

এটি শীর্ষে সরানোর কোন উপায় আছে? গুণিতগুলি কাস্টমাইজ করুন এবং দেখান?
জি_মনি

না এই গ্রন্থাগারটি কেবলমাত্র বেসিক টোস্ট বার্তাগুলি সমর্থন করে। আপনি কেবল বিজি এবং পাঠ্যের রঙ এবং বার্তার সময়কাল পরিবর্তন করতে পারেন।
এফ কে বে

4

@ মেনগটাইম, @ অ্যালেক্স-চেঙ্গালানের দ্রবণে একাধিক টোস্ট ইস্যু সমাধান করার জন্য, আমি কেবল সমস্ত কিছু ShowAlert()একটি চেক দিয়ে গুটিয়ে রেখেছিলাম কিনা তা দেখতে alertএবং alertDelayনাল হয়ে যায়, তারপরে DismissMessage, নাল আউট alertএবং alertDelay

void ShowAlert(string message, double seconds)
    {
        if(alert == null && alertDelay == null) {
            alertDelay = NSTimer.CreateScheduledTimer(seconds, (obj) =>
            {
                DismissMessage();
            });
            alert = UIAlertController.Create(null, message, UIAlertControllerStyle.Alert);
            UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(alert, true, null);
        }
    }

    void DismissMessage()
    {
        if (alert != null)
        {
            alert.DismissViewController(true, null);
            alert = null;
        }
        if (alertDelay != null)
        {
            alertDelay.Dispose();
            alertDelay = null;
        }
    }

যদি আপনি কোনও দ্রুত সমাধানের সন্ধান করছেন তবে এটি ইউআই হ্যাঙ্গটিকে কমপক্ষে সাফ করে দেবে বলে মনে হয়েছিল। আমি একটি নতুন পৃষ্ঠায় নেভিগেশন টোস্টটি প্রদর্শনের চেষ্টা করছিলাম এবং বিশ্বাস করি যে PresentViewControllerসেটটি মূলত আমার নেভিগেশন বাতিল করে দিচ্ছে। দুঃখিত আমি থ্রেডের মধ্যে কোনও মন্তব্য করি নি, আমার খ্যাতিও খুব কম :(


2

ShowAlertএমনকি পপআপ পৃষ্ঠায় টোস্ট প্রদর্শিত হচ্ছে তা নিশ্চিত করার জন্য এটি আয়ান ওয়ার্ববার্টনের সংস্করণটির আমার উন্নত সংস্করণ। তদ্ব্যতীত, যদি ব্যবহারকারী টোস্টের বাইরে ক্লিক করেন তবে টোস্টটি অসন্তুষ্ট হবে। আমি UIAlertControllerStyle.ActionSheetদেখতে দেখতে টোস্ট পছন্দ করি তবে এটি কাজ করেUIAlertControllerStyle.Alert

    void ShowAlert(string message, double seconds)
    {
        var alert = UIAlertController.Create(null, message, UIAlertControllerStyle.ActionSheet);

        var alertDelay = NSTimer.CreateScheduledTimer(seconds, obj =>
        {
            DismissMessage(alert, obj);
        });

        var viewController = UIApplication.SharedApplication.KeyWindow.RootViewController;
        while (viewController.PresentedViewController != null)
        {
            viewController = viewController.PresentedViewController;
        }
        viewController.PresentViewController(alert, true, () =>
        {
            UITapGestureRecognizer tapGesture = new UITapGestureRecognizer(_ => DismissMessage(alert, null));
            alert.View.Superview?.Subviews[0].AddGestureRecognizer(tapGesture);
        });
    }

আমি আশা করি এটি কারও সাহায্য করবে!


1

ফর্মগুলিতে কোনও অন্তর্নির্মিত প্রক্রিয়া নেই, তবে এই ন্যুগেট প্যাকেজটি অনুরূপ কিছু সরবরাহ করে

https://github.com/EgorBo/Toosts.forms.Plugin

দ্রষ্টব্য: এগুলি অ্যান্ড্রয়েড স্টাইলের টোস্টগুলি যেমন প্রশ্নের অনুরোধে নয় তবে ইউডাব্লুপি স্টাইল টোস্ট যা সিস্টেম ওয়াইড বিজ্ঞপ্তি।


4
অ্যান্ড্রয়েড টোস্টের অর্থ সম্পূর্ণ ভিন্ন জিনিস - এটি একটি পপআপ বার্তা। এই গ্রন্থাগারটি সিস্টেম-ব্যাপী বিজ্ঞপ্তির জন্য।
ভোজটাচ স্যাজেল

আমি লাইব্রেরিটি ইনস্টল করার আগে এই মন্তব্যটি পড়া উচিত ছিল তখনই লক্ষ্য করা যায় যে এগুলি অ্যান্ড্রয়েড স্টাইলের টোস্ট নয় .. উত্তরে দয়া করে এটি পরিষ্কার করুন।
findusl

1

আমি https://github.com/ishrakland/Toast/https://www.nuget.org/packages/Plugin.Toast/ ব্যবহার করি

ক্রসটোস্টপপআপ.কন্টেনার.শো টোস্টমেসেজ ("লোডিং", প্লাগইন.টোস্ট.অ্যাবস্ট্রাকশনস.টোয়াস্টলেন্থ.শোর্ট);

এটি চেষ্টা করুন, দুর্দান্ত


1

আমি আরজি.প্লাগিন্সের সাথে একটি কাস্টম পপআপ কাস্টমাইজ করেছি opপপআপ নুগেট এটি একটি উদাহরণ:

 <pages:PopupPage.Animation>
    <animations:ScaleAnimation 
        PositionIn="Center"
        PositionOut="Center"
        ScaleIn="1.2"
        ScaleOut="0.8"
        DurationIn="600"
        DurationOut="600"
        EasingIn="Linear"
       EasingOut="Linear"/>
</pages:PopupPage.Animation>

<Frame CornerRadius="10"  
    HeightRequest="30"
       VerticalOptions="End"
       HorizontalOptions="Fill"
       HasShadow="False"
        Padding="0" Margin="40,50"
       OutlineColor="LightGray">
    <StackLayout 
    Opacity="0.4"
       BackgroundColor="White">
    <Label
        x:Name="lbl"
        LineBreakMode="WordWrap"
        HorizontalTextAlignment="Center"
                    VerticalTextAlignment="Center"

        VerticalOptions="CenterAndExpand"
        HorizontalOptions="Center" TextColor="Black" FontSize="12">
                <Label.FontFamily>
                    <OnPlatform x:TypeArguments="x:String">
                        <On Platform="iOS" Value="NewJuneMedium" />
                    </OnPlatform>
                </Label.FontFamily>
            </Label>
</StackLayout>
    </Frame>

তারপরে আপনার বেসকন্টেপেজে কিছুক্ষণের পরে "টোস্ট" দেখানোর জন্য এবং লুকানোর জন্য আপনি নীচের কোডটি যুক্ত করতে পারেন:

public async void showpopup(string msg)
    {
        await Navigation.PushPopupAsync(new Toast(msg));
        await Task.Delay(3000);
        await Navigation.PopPopupAsync(true);   
    }

0

উপরের আইওএসের উত্তরগুলি আমার জন্য কাজ করেছে তবে একটি সামান্য সমস্যার জন্য - একটি সতর্কতা: ইউআইএলআরলেট কনট্রোলার উপস্থাপনের চেষ্টা ... যার দৃষ্টিভঙ্গি উইন্ডো শ্রেণিবদ্ধ নয়!

কিছু অনুসন্ধানের পরে, আমি এই সম্পর্কহীন উত্তর জুড়ে এসেছি যা সাহায্য করেছিল। পোস্টারটি মন্তব্য করেছে "এটি নির্বোধ দেখায় তবে কাজ করে", যা উভয়ই বিবেচনায় সঠিক।

সুতরাং, আমি এই লাইনগুলি দিয়ে উপরে শোআলার্ট () ফাংশনটি সংশোধন করেছি, যা কাজ করে বলে মনে হচ্ছে:

    var rootVC = UIApplication.SharedApplication.KeyWindow.RootViewController;
    while ( rootVC.PresentedViewController != null) {
        rootVC = rootVC.PresentedViewController;
    }
    rootVC.PresentViewController( alert, true, null);

ডাং - আমি নীচে @ পিয়েরে-আলেকজান্দ্রে ফ্ল্যাচের থেকে আরও উন্নত সংস্করণ দেখতে পাচ্ছি। এর আগে আমি কীভাবে মিস করেছি?
bobwki

0

ইউডাব্লুপি জন্য

public void ShowMessageFast(string message)
    {
        ToastNotifier ToastNotifier = ToastNotificationManager.CreateToastNotifier();
        Windows.Data.Xml.Dom.XmlDocument toastXml = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);
        Windows.Data.Xml.Dom.XmlNodeList toastNodeList = toastXml.GetElementsByTagName("text");
        toastNodeList.Item(0).AppendChild(toastXml.CreateTextNode("Test"));
        toastNodeList.Item(1).AppendChild(toastXml.CreateTextNode(message));
        Windows.Data.Xml.Dom.IXmlNode toastNode = toastXml.SelectSingleNode("/toast");
        Windows.Data.Xml.Dom.XmlElement audio = toastXml.CreateElement("audio");
        audio.SetAttribute("src", "ms-winsoundevent:Notification.SMS");

        ToastNotification toast = new ToastNotification(toastXml);
        toast.ExpirationTime = DateTime.Now.AddSeconds(4);
        ToastNotifier.Show(toast);
    }

-5

তুমি ব্যবহার করতে পার DisplayAlert("", "", "", "" );


4
এটি টোস্টের মতো মোটেও প্রতিক্রিয়া দেখায় না, এটি চালিয়ে যাওয়ার জন্য একটি ক্রিয়া প্রয়োজন।
সেনোকক্সএক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.