टोमारीन फॉर्म के लिए टोस्ट बराबर


90

क्या Xamarin Forms (Android या iOS विशिष्ट) का उपयोग करने का कोई तरीका नहीं है, जैसे कि Android टोस्ट के साथ करता है, जिसे उपयोगकर्ता की सहभागिता की आवश्यकता नहीं है और समय (लघु) अवधि के बाद दूर हो जाता है?

चारों ओर खोज करने से मैं देख रहा हूं कि उपयोगकर्ता को दूर जाने के लिए क्लिक की आवश्यकता होती है।

जवाबों:


171

इसके लिए एक सरल उपाय है। DependencyService का उपयोग करके आप आसानी से Android और iOS दोनों में टोस्ट-लाइक दृष्टिकोण प्राप्त कर सकते हैं।

अपने सामान्य पैकेज में एक इंटरफ़ेस बनाएँ।

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

Android अनुभाग

[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();
        }
    }
}

iOS अनुभाग

आईओएस में टोस्ट जैसा कोई देशी समाधान नहीं है, इसलिए हमें अपने दृष्टिकोण को लागू करने की आवश्यकता है।

[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
DependencyService लाइन में मुझे "ऑब्जेक्ट संदर्भ किसी ऑब्जेक्ट की आवृत्ति पर सेट नहीं किया जा रहा है।"
जॉइस डी लन्ना

5
हाँ, यह अब तक का सबसे अच्छा जवाब है, मुझे निर्भरता सेवा पसंद है
लुताया हुज़ैफा इदरीस

1
जीत से भरा हुआ। क्या आपके पास इसका UWP संस्करण भी होगा?
निएमिनेन

1
@ मेनटेम मुझे लगता है कि हर बार एक नया अलर्ट और टाइमर बनाकर अटक यूआई को ठीक किया जाता है। दोनों को पास होने की जरूरत है DismissMessage
इयान वॉर्बर्टन

14

यहाँ अलेक्स चेंगलान के iOS कोड का एक संस्करण दिया गया है, जिसमें कई संदेश दिखाए जाने पर 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 पैकेज का उपयोग nuget और नीचे दिए गए कोड की तरह कर सकते हैं,

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

9

हम सामान्य रूप से एगोर टोस्ट्स प्लगइन का उपयोग करते हैं, लेकिन जैसा कि हमें वर्तमान प्रोजेक्ट के लिए iOS पर अनुमतियों की आवश्यकता होती है, हम Rg.Plugins.Popup nuget ( https://github.com/rotorgames/Rg.Plugins.Plup) का उपयोग करके एक अलग मार्ग पर चले गए हैं। )।

मैंने पॉपअप पेज का एक बुनियादी 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();

पॉपअप पृष्ठ को उपयोगकर्ता द्वारा पृष्ठ प्रदर्शन के बाहर टैप करके खारिज किया जा सकता है (यह स्क्रीन भर नहीं है, यह मानते हुए)।

यह iOS / Droid पर खुशी से काम करता है, लेकिन मैं सुधार के लिए खुला हूं, अगर किसी को पता है कि यह करने का जोखिम भरा तरीका है।


आरजी पॉपअप महान हैं। मैं पूर्ण पृष्ठ पर प्रदर्शन या गतिविधि संकेतक लोड करने के लिए समान समाधान करता हूं। अन्य प्लगइन्स के साथ समस्या यह है कि वे async फ़ंक्शन और मुख्य थ्रेड पर निर्भर हैं, लेकिन rg पॉपअप 2nd थ्रेड पर चल सकता है जो इसे बहुत उपयोगी बनाता है। वास्तव में अच्छा विचार है, लेकिन मैं एंड्रॉइड टोस्ट की तरह देशी देखो चाहता हूं।
एमिल

अब तक क्रॉस प्लेटफॉर्म टोस्ट करने के लिए यह सबसे अच्छा तरीका है। Rg.Popup सुपर फ्लेक्सिबल है, और मैं लगभग हर प्रोजेक्ट में इसका उपयोग करता हूं। टोस्ट को प्रदर्शित करने के लिए अन्य प्लगइन्स या प्लेटफ़ॉर्म कोड का उपयोग करने की आवश्यकता नहीं है,
GiampaoloGabba

8

एलेक्स के जवाब में जोड़ना, यहाँ UWP संस्करण है:

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वास्तव में ऊंचाई को कम से कम रखना आवश्यक है।


तो एक डिपेंडेंसी सर्विस के रूप में इसे पंजीकृत करने के लिए UWP की आवश्यकता नहीं है?
ओलोरुनफेमी अज़ीबुलु

यह अन्य दो वेरिएंट की तरह ही काम करता है। हाँ, एक निर्भरता सेवा।
गोबोर

7

आप IUserDialog NuGet का उपयोग कर सकते हैं और बस इसे टोस्टअलर्ट का उपयोग कर सकते हैं

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 Nuget libriary से

UserDialogs.Instance.ShowLoading("Loading");

क्या इसे शीर्ष पर ले जाने का कोई तरीका है? अनुकूलित करें और गुणक दिखाएं?
G_Money

नहीं। यह लाइब्रेरी केवल मूल टोस्ट संदेशों का समर्थन करती है। आप बस bg और टेक्स्ट का रंग और संदेश की अवधि बदल सकते हैं।
Fk Bey

4

@MengTim, @ एलेक्स-चेंगलान के समाधान में कई टोस्ट मुद्दे को ठीक करने के लिए, मैंने बस 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/Toasts.Forms.Plugin

नोट: ये एंड्रॉइड स्टाइल टोस्ट नहीं हैं जैसा कि प्रश्न में अनुरोध किया गया है, लेकिन UWP स्टाइल टोस्ट जो सिस्टम की विस्तृत सूचनाएँ हैं।


5
एंड्रॉइड टोस्ट का मतलब पूरी तरह से अलग चीज है - यह एक पॉपअप संदेश है। यह लाइब्रेरी सिस्टम-वाइड नोटिफिकेशन के लिए है।
वोजत साज़ेल

लाइब्रेरी को स्थापित करने से पहले मुझे टिप्पणी पढ़नी चाहिए थी, ताकि ये एंड्रॉइड स्टाइल टोस्ट न हों .. कृपया उत्तर में स्पष्ट करें।
findusl


1

मैंने Rg.Plugins.Popup NuGet के साथ एक कस्टम पॉपअप को अनुकूलित किया है यह एक उदाहरण है:

 <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

ऊपर दिए गए iOS उत्तर मेरे लिए काम करते हैं लेकिन एक छोटी सी समस्या के लिए - एक चेतावनी: UIAlertController प्रस्तुत करने का प्रयास करें ... जिसका दृश्य विंडो पदानुक्रम में नहीं है!

कुछ खोज के बाद, मैं इस पार आया असंबंधित उत्तर के जिसने मदद की। पोस्टर ने टिप्पणी की "यह बेवकूफ लग रहा है लेकिन काम करता है", जो कि दोनों मायने रखता है।

इसलिए, मैंने इन लाइनों के साथ ShowAlert () फ़ंक्शन को संशोधित किया, जो काम करने के लिए लगता है:

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

डांग - मैं @ पियरे-एलेक्जेंडर फ्लेच से नीचे का इससे भी बेहतर संस्करण देखता हूं। मुझे इससे पहले कैसे याद किया?
bobwki

0

UWP के लिए

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("", "", "", "" );


1
यह टोस्ट की तरह बिल्कुल भी प्रतिक्रिया नहीं करता है, इसे जारी रखने के लिए एक कार्रवाई की आवश्यकता होती है।
11
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.