Hierfür gibt es eine einfache Lösung. Mit dem DependencyService können Sie den Toast-ähnlichen Ansatz sowohl in Android als auch in iOS problemlos erhalten.
Erstellen Sie eine Schnittstelle in Ihrem gemeinsamen Paket.
public interface IMessage
{
void LongAlert(string message);
void ShortAlert(string message);
}
Android-Bereich
[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-Bereich
In iOs gibt es keine native Lösung wie Toast, daher müssen wir unseren 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 wir auf jeder Plattform unsere Klassen bei DependencyService registrieren müssen.
Jetzt können Sie überall in unserem Projekt auf unseren Toast-Service zugreifen.
DependencyService.Get<IMessage>().ShortAlert(string message);
DependencyService.Get<IMessage>().LongAlert(string message);
DismissMessage
.Hier ist eine Version von Alex Chengalans iOS- Code , die verhindert, dass die Benutzeroberfläche hängen bleibt, wenn mehrere Nachrichten angezeigt werden ...
quelle
Normalerweise verwenden wir das Egors Toasts-Plugin, aber da für ein aktuelles Projekt Berechtigungen unter iOS erforderlich sind, haben wir mit Rg.Plugins.Popup nuget ( https://github.com/rotorgames/Rg.Plugins.Popup) einen anderen Weg eingeschlagen ).
Ich habe eine grundlegende xaml / cs-Seite vom Typ PopupPage geschrieben.
und lassen Sie es von einem Dienst erstellen, dessen Schnittstelle Sie beim Start der App registrieren oder Xamarin.Forms.DependencyService zum Abrufen des Dienstes verwenden.
Der Dienst aktualisiert die von PopupPage abgeleitete Seite und tut dies
Die Popup-Seite kann vom Benutzer durch Tippen außerhalb der Seitenanzeige geschlossen werden (vorausgesetzt, sie hat den Bildschirm nicht ausgefüllt).
Dies scheint unter iOS / Droid gut zu funktionieren, aber ich bin offen für Korrekturen, wenn jemand weiß, was dies eine riskante Methode ist.
quelle
Sie können das Acr.UserDialogs-Paket aus Nuget und Code wie unten verwenden.
quelle
Neben Alex 'Antwort ist hier die UWP-Variante:
Das Färben und Stylen liegt bei Ihnen, das
MaxHeight
ist tatsächlich erforderlich, um die Höhe auf einem Minimum zu halten.quelle
Sie können IUserDialog NuGet verwenden und einfach toastAlert verwenden
quelle
Hier ist ein Code-Snippet, mit dem ich den Toast in Xamarin.iOS zeige
quelle
@MengTim, um das Problem mit mehreren Toasts in der Lösung von @ alex-chengalan zu beheben, habe ich einfach alles
ShowAlert()
mit einer Prüfung versehen, um zu sehen, obalert
undalertDelay
null sind, dann innerhalbDismissMessage
, nullalert
undalertDelay
.Das schien zumindest den UI-Hang zu klären, wenn Sie nach einer schnellen Lösung suchen. Ich habe versucht, den Toast bei der Navigation zu einer neuen Seite anzuzeigen, und glaube, dass das
PresentViewController
Festlegen meine Navigation im Wesentlichen aufhebt. Entschuldigung, ich habe nicht innerhalb des Threads kommentiert, mein Ruf ist zu niedrig :(quelle
Ich würde
Plugin.Toast
Bibliothek von empfehlennuget
. Es funktioniert gut.oder vom ACR.UserDialogs Nuget-Bibliothekar
quelle
In Forms ist kein Mechanismus integriert, aber dieses Nuget-Paket bietet etwas Ähnliches
https://github.com/EgorBo/Toasts.Forms.Plugin
Hinweis: Hierbei handelt es sich nicht um Toasts im Android-Stil, wie in der Frage gefordert, sondern um Toasts im UWP-Stil, bei denen es sich um systemweite Benachrichtigungen handelt.
quelle
Dies ist meine verbesserte
ShowAlert
Version von Ian Warburtons Version, um sicherzustellen, dass der Toast auch auf der Popup-Seite angezeigt wird. Außerdem wird der Toast verworfen, wenn der Benutzer außerhalb des Toasts klickt. Ich habeUIAlertControllerStyle.ActionSheet
diesen Look wie Toast benutzt, aber er funktioniert auch mitUIAlertControllerStyle.Alert
Ich hoffe das hilft jemandem!
quelle
Ich verwende https://github.com/ishrakland/Toast/ In https://www.nuget.org/packages/Plugin.Toast/
Beispiel CrossToastPopUp.Current.ShowToastMessage ("Laden", Plugin.Toast.Abstractions.ToastLength.Short);
Probieren Sie es aus, es ist großartig
quelle
Die obigen iOS-Antworten haben bei mir funktioniert, aber bei einem kleinen Problem - einer Warnung: Versuchen Sie, UIAlertController zu präsentieren ... dessen Ansicht nicht in der Fensterhierarchie enthalten ist!
Nach einiger Suche stieß ich auf diese nicht verwandte Antwort, die half. Das Poster kommentierte "Das sieht dumm aus, funktioniert aber", was in beiden Punkten richtig ist.
Also habe ich die ShowAlert () -Funktion oben mit diesen Zeilen geändert, die zu funktionieren scheinen:
quelle
Für UWP
quelle
Ich habe ein benutzerdefiniertes Popup mit Rg.Plugins.Popup NuGet angepasst. Dies ist ein Beispiel:
Dann können Sie auf Ihrer Basisinhaltsseite den folgenden Code hinzufügen, um den "Toast" nach einer Weile ein- und auszublenden:
quelle
Sie können verwenden
DisplayAlert("", "", "", "" );
quelle