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




xamarin xamarin-forms (10)

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

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


@MengTim, @ एलेक्स-चेंगलान के समाधान में कई टोस्ट मुद्दे को ठीक करने के लिए, मैंने शोअर्लर्ट () के भीतर सब कुछ लपेट दिया, यह देखने के लिए कि अगर अलर्ट और अलर्टडेल अवेलेबल हैं, तो डिसमिसटेज के भीतर, अलर्ट और अलर्टडेल को खारिज कर दें।

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 अनिवार्य रूप से आपके नेविगेशन को रद्द कर रहा था। क्षमा करें, मैंने थ्रेड के भीतर टिप्पणी नहीं की, मेरी प्रतिष्ठा बहुत कम है :(


Android, iOS और UWP के लिए plugin.toast v 2.1.2 उपलब्ध है


आप DisplayAlert("", "", "", "" ); उपयोग कर सकते हैं DisplayAlert("", "", "", "" );


आप Acr.UserDialogs पैकेज का उपयोग nuget और नीचे दिए गए कोड की तरह कर सकते हैं,

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

इसके लिए एक सरल उपाय है। 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);

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

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

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

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

फॉर्म में कोई अंतर्निहित तंत्र नहीं है, लेकिन यह नगेट पैकेज कुछ इसी तरह की आपूर्ति करता है

https://github.com/EgorBo/Toasts.Forms.Plugin

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


यह सुनिश्चित करने के लिए इयान ShowAlert संस्करण का मेरा बेहतर ShowAlert संस्करण है, यह सुनिश्चित करने के लिए कि पॉपअप पृष्ठ पर भी टोस्ट प्रदर्शित किया गया है। इसके अलावा, यदि उपयोगकर्ता टोस्ट के बाहर क्लिक करता है, तो टोस्ट को खारिज कर दिया जाता है। मैंने UIAlertControllerStyle.ActionSheet उपयोग किया है जो टोस्ट को पसंद करता है लेकिन यह UIAlertControllerStyle.Alert साथ भी काम 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);
        });
    }

मुझे उम्मीद है कि यह किसी की मदद करेगा!


यहाँ एक कोड स्निपेट है जिसे मैं 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();
    }

हम सामान्य रूप से एगोर टोस्ट्स प्लगइन का उपयोग करते हैं, लेकिन जैसा कि हमें वर्तमान प्रोजेक्ट के लिए iOS पर अनुमतियों की आवश्यकता होती है, हम Rg.Plugins.Popup nuget ( 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();

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

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







toast