Xamarin FormsでAndroidのToastを表示!
Xamarin FormsでAndroidのToastを表示するにはちょっと遠回りが必用です。
ToastなんてWindowsでいうMessageBox並みに一番最初にHello World!でやるやつちゃうん?と思うのですがMessageBoxだってWindow Handleを懇切丁寧に設定すればある程度めんどくさいので仕方ないのかもしれません。
前提
Xamarin Formsのプロジェクトの概要についてはこちらを。
Interfaceの作成
共通クラスから各Android, iOS向けの処理を呼ぶにはDependencyServiceというのを使います。
Toastを表示させたい場合はToastの機能自体はAndroid/iOSに依存した処理なので共通プロジェクト側にIToastというinterfaceを作成して実体をAndroid側に記載します。
まず共通プロジェクト側にInterfaceを作成します。
namespace DearFutureMe.Interface { public interface IToast { void Show(string message); } }
そしてAndroid側に実体を作ります。
using Android.Widget; using DearFutureMe.Interface; using DearFutureMe.Droid.Entity; [assembly: Xamarin.Forms.Dependency(typeof(ToastEntity))] namespace DearFutureMe.Droid.Entity { public class ToastEntity : IToast { public void Show(string message) { Toast.MakeText(Android.App.Application.Context, message, ToastLength.Long).Show(); } } }
これでAndroidプロジェクトの処理を呼べるようになりました。
少し奇妙ですがusingで自分自身のnamespaceを呼んで自分の実体の前にassemblyを書く必要があります。
一番最初に起動するのはAboutPage.xaml.csなのでAboutPage.xaml.csのonAppearing()から呼び出します。
using System; using System.ComponentModel; using Xamarin.Forms; using Xamarin.Forms.Xaml; using DearFutureMe.Interface; namespace DearFutureMe.Views { public partial class AboutPage : ContentPage { public AboutPage() { InitializeComponent(); } protected override void OnAppearing() { base.OnAppearing(); var toast = DependencyService.Get(); toast.Show("Toast Message"); } } }
実行
そして実行すると起動時にこのようにToastが起動します。
シーケンス
シーケンス的には下記のイメージです。(たぶん同期で動いてます。)
コメント