2016-02-08 26 views
19

Gibt es eine Möglichkeit Xamarin Forms (nicht Android- oder iOS-spezifisch) ein Popup haben, wie Android mit Toast macht, dass keine Interaktion mit dem Benutzer braucht und geht nach einer gewissen Zeit?Toast Äquivalent auf Xamarin Forms

Von um alle auf der Suche ich sehe sind Warnungen, die Benutzer benötigen, um wegzugehen klickt.

Antwort

6
+0

Vielen Dank für die Links. Ich habe das NuGet-Paket in mein Xamarin Forms-Projekt im Xamarin Studio eingefügt. Allerdings, wenn ich versuche, es zu benutzen - durch Aufruf von DependencyService.Get (); - es gibt immer null zurück. Haben Sie das wirklich in Xamarin ausgeführt und/oder haben Sie eine Idee, was ich tun muss? Ich habe buchstäblich nur das Paket hinzugefügt und dann die beiden hinzugefügt Zeilen in der Dokumentation, um es auszuprobieren - die erste Zeile ist die DependencyService Get. – Jimmy

+0

Vergessen zu erwähnen, es sagt auch, um DependencyService.Register () zu tun - aber ToastNotificatorImplementation kann nicht gelöst werden.Auch nicht sicher, was zu tun, dachte ich, es wäre alles im selben Namespace - Plugin.Toasts – Jimmy

+0

@Jimmy Wie sieht dieser Code von Ihnen aus? –

1

ist ein Code-Snippet, das ich den Toast Show bin mit in 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(); 
    } 
31

Es gibt eine einfache Lösung. Durch die DependencyService können Sie ganz einfach den Toast-Like Ansatz in Android und iOS bekommen.

eine Schnittstelle in Ihrem gemeinsamen Paket erstellen.

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

Android Abschnitt

[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 Abschnitt

In iOs gibt es keine native Lösung wie Toast, so müssen wir unsere eigenen Ansatz implementieren.

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

Bitte beachten Sie, dass in jeder Plattform, müssen wir unsere Klassen mit DependencyService registrieren.

Jetzt können Sie Toast Service in überall in unserem Projekt zugreifen aus.

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

Dies ist bei weitem die beste Antwort auf diese Frage. Es sind keine Plugins oder Bibliotheken von Drittanbietern erforderlich. –

+1

in DependencyService-Zeile Ich bekomme "Objektverweis nicht auf eine Instanz eines Objekts festgelegt." –

+2

Yeah das ist die beste Antwort bisher, ich mag Abhängigkeitsdienst –

0

Wir würden normalerweise Egors Toast-Plugin verwenden, aber wie es Berechtigungen für iOS für ein aktuelles Projekt erfordert haben wir einen anderen Weg mit Rg.Plugins.Popup nuget (https://github.com/rotorgames/Rg.Plugins.Popup) gegangen.

Ich schrieb eine grundlegende XAML/cs Seite vom Typ PopupPage,

<?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"> 
... 

und von einem Dienst erstellt, deren Schnittstelle Sie bei App registrieren starten oder Xamarin.Forms.DependencyService den Dienst zu holen verwenden würde auch lebensfähig sein.

Die Service Nachrichten auf die PopupPage abgeleitete Seite und tut

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

Die Popup-Seite außerhalb der Seitenanzeige durch Antippen durch den Benutzer entlassen werden (vorausgesetzt, es nicht auf den Bildschirm gefüllt ist).

Dies scheint glücklich zu sein auf iOS/Droid, aber ich bin offen für die Korrektur, wenn jemand weiß, was dies eine riskante Art ist, es zu tun.

0

@MengTim, um das Problem mit mehreren Toast in @ alex-chengalans Lösung zu beheben, habe ich einfach alles in ShowAlert() mit einer Prüfung umhüllt, um zu sehen, ob alert und alertDelay null sind, dann innerhalb von DismissMessage, nulled out alert und 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; 
     } 
    } 

Das schien zumindest die UI aufhängen, wenn Sie nach einer schnellen Lösung suchen. Ich habe versucht, den Toast beim Navigieren zu einer neuen Seite anzuzeigen, und glaube, dass der PresetViewController, der eingestellt wird, im Wesentlichen meine Navigation aufhebt. Entschuldigung, ich habe nicht innerhalb des Threads kommentiert, mein Ruf ist zu niedrig :(