菜鸟的Xamarin.Forms前行之路——原生Toast的简单实现方法

时间:2022-11-23 17:04:54

 项目中信息提示框,貌似只有个DisplayAlert,信息提示太过于单一,且在有些场合Toast更加实用,以下是一个简单的原生Toast的实现方法

项目地址:https://github.com/weiweu/TestProject/tree/dev/Toast

共享项目

定义一个接口IToast,包括Short和Long两个方法:

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

安卓

在安卓平台实现接口的方法并注入,添加一个Toast_Android.cs文件:

[assembly: Dependency(typeof(Toast_Android))]
namespace Sample.Droid
{
public class Toast_Android : IToast
{
public void LongAlert(string message)
{
Toast.MakeText(Android.App.Application.Context, message, ToastLength.Long).Show();
}
public void ShortAlert(string message)
{
Toast.MakeText(Android.App.Application.Context, message, ToastLength.Short).Show();
}
}
}

 

Ios

在Ios平台实现接口的方法并注入,添加一个Toast_Ios.cs文件:

[assembly: Xamarin.Forms.Dependency(typeof(Toast_Ios))]
namespace Sample.iOS
{
public class Toast_Ios : IToast
{
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();
}
}
}
}

 

使用方法

例如在2个按钮的点击事件中实现Toast

xaml:

  <Button Text="Short Toast" Clicked="Short_Clicked"/>

<Button Text="Long Toast" Clicked="Long_Clicked"/>

cs:

  void Short_Clicked(object sender, EventArgs e)
{
DependencyService.Get<IToast>().ShortAlert("Short Toast");
}
void Long_Clicked(object sender, EventArgs e)
{
DependencyService.Get<IToast>().LongAlert("Long Toast");
}