2016-02-08 6 views
19

Есть ли способ использовать Xamarin Forms (не специально для Android или ios), чтобы иметь всплывающее окно, например, Android с тостами, которое не требует взаимодействия с пользователем и уходит через какое-то время?Тост-эквивалент на форматах Xamarin

От поиска вокруг всех, что я вижу, являются предупреждения, требующие щелчков пользователя, чтобы уйти.

ответ

6

Проверьте эти пакеты также для оповещения Диалоги и тостов:

+0

Спасибо, ребята, за ссылки. В итоге я добавил пакет NuGet в свой проект Xamarin Forms в Xamarin Studio. Однако, когда я пытаюсь его использовать - вызывая DependencyService.Get (); - он всегда возвращает значение null. Ребята, действительно, запускаете это в Xamarin и/или имеете какое-либо представление о том, что мне нужно делать? Я буквально просто добавил пакет, а затем добавил два строки в документации для его проверки - первая строка - это DependencyService Get. – Jimmy

+0

Забыл упомянуть, он также говорит, чтобы позвонить в DependencyService.Register () - но ToastNotificatorImplementation не может быть разрешен. Опять же, не уверен, что чтобы сделать, я думал, что все будет в том же пространстве имен - Plugin.Toasts. – Jimmy

+0

@Jimmy, как выглядит этот код? –

1

Вот фрагмент кода, который я использую, чтобы показать тост в 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

Существует простое решение для этого. Используя DependencyService, вы можете легко получить подход Toast-Like в 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 раздел

в ИО не родное решение, как Toast, так что нам нужно реализовать свой собственный подход.

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

Теперь вы можете получить доступ к сервису Toast в любом месте нашего проекта.

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

Это, безусловно, лучший ответ на этот вопрос. Никаких сторонних плагинов или библиотек не требуется. –

+1

в строке DependencyService Я получаю «Ссылка на объект не установлена ​​в экземпляр объекта». –

+2

Да, это лучший ответ, мне нравится служба зависимостей –

0

мы обычно используем плагин Тосты Егорова, но так как он требует разрешений на прошивке для текущего проекта мы пошли по другому пути, используя Rg.Plugins.Popup NuGet (https://github.com/rotorgames/Rg.Plugins.Popup).

Я написал основную XAML/CS страницы типа 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"> 
... 

и его создатель службы, чей интерфейс регистрации в приложении или начать использовать Xamarin.Forms.DependencyService для извлечения службы будет быть жизнеспособным тоже.

Новостей службы до производной страница PopupPage, и делает

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

всплывающих страницы могут быть отклонен пользователем нажатия вне отображения страницы (если он еще не заполнил экрана).

Это похоже на работу с iOS/Droid, но я открыт для исправления, если кто-то знает, что это опасный способ сделать это.

0

@MengTim, чтобы исправить проблему с несколькими тостами в решении @ alex-chengalan, я просто завернул все в ShowAlert() с проверкой, чтобы увидеть, являются ли alert и alertDelay нулевыми, а затем в DismissMessage, избили предупреждение и 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 существенно отменяет мою навигацию. Извините, я не прокомментировал ничью, моя репутация слишком низкая :(

 Смежные вопросы

  • Нет связанных вопросов^_^