Code for final

ふぁいなる向けのコード置き場です。すでにコードじゃないこともいっぱい。

Xamarin.Forms + Prismで空プロジェクトをビルドしただけなのに「"ResolveLibraryProjectImports" タスクが予期せずに失敗しました。」

ついこないだまでXamarin.Froms + Prismのプロジェクトが作成できていましたが、
いつからかビルドするとエラーになるようになりました。

前回失敗したファイルパスの問題ではないはずです。短くなるようにしたので。 final.hateblo.jp

f:id:finalstream:20171125205509p:plain

エラー一覧の下の方に以下のようなエラーが…。

The current .NET SDK does not support targeting .NET Standard 2.0.  Either target .NET Standard 1.6 or lower, or use a version of the .NET SDK that supports .NET Standard 2.0.

なんか足りないのかーということで、
以下のリンク先で『.NET Core SDK 2.0.x』をダウンロードしてインストール。

www.microsoft.com

インストール後、VisualStudioをあげなおして、ビルドしたところ成功しました!

原因は謎ですが、VisualStudioかXamarinかPrismを更新したときにデフォルトのターゲットフレームワークが変わったんだと思います。

Xamarin.FormsでSnackbarを表示する方法。

Xamarin.FormsでToastを表示する方法を調べていたらいたのですが、いまはToastではなく、Snackbarの時代なんですね。

ということでXamarin.FormsでSnackbarを表示する方法です。

Xamarinの場合、以下のプラグインをいれると簡単に表示できますのでありがたく使用させていただきましょう。

github.com

nugetでインストールできます。
"Toasts.Forms.Plugin"でソリューション内の全部のプロジェクトにインストールします。

僕はAndroidしか持っていないのでここからはAndroidオンリーなコードしか記載しませんが、上記のプラグインはXamarinなのでマルチプラットフォーム対応してます。

まず、ActivityのOnCreateにコードをたします。

        protected override void OnCreate(Bundle bundle)
        {
            TabLayoutResource = Resource.Layout.tabs;
            ToolbarResource = Resource.Layout.toolbar;

            base.OnCreate(bundle);

// ここから
            DependencyService.Register<ToastNotification>(); 
            var platformOptions = new PlatformOptions();
            platformOptions.Style = NotificationStyle.Snackbar;
            ToastNotification.Init(this, platformOptions);
// ここまで

            global::Xamarin.Forms.Forms.Init(this, bundle);
            LoadApplication(new App(new AndroidInitializer(this)));
        }

ポイントはPlatformOptionsでスタイルを指定することです 。
Snackbarと指定しないと通知になります。
これがどこにも書いてなくてソースをおっかけました。

逆に言えばこのプラグインを使用することで、通知も簡単に投げれるということですが。

次に共通ロジック(PCL)の呼び出すところです。
今回のコードは接続が成功したらSnackbarを表示するコードです。

            LeonetConnecter.Connected += async (sender, args) =>
            {
                var notificator = DependencyService.Get<IToastNotificator>();
                var androidOptions = new AndroidOptions();
                androidOptions.DismissText = "";

                var options = new NotificationOptions()
                {
                    Title = "Success",
                    AndroidOptions = androidOptions
                };

                await notificator.Notify(options);
            };

これだけで以下のように表示できます。

f:id:finalstream:20171119184549p:plain

ちなみにスナックバーはトーストと違ってアクションを受け取ることができます。
DismissTextを設定することでアクションボタンができます。

f:id:finalstream:20171119185422p:plain

Notifyメソッドの戻り値でボタンが押されたかわかりますので、簡単ですね。

Xamarinで空プロジェクトをビルドしただけなのに「"ResolveLibraryProjectImports" タスクが予期せずに失敗しました。」

久々にXamarinを使ってみようと空のプロジェクトを作成し、ビルドしただけなのにエラー。

え、なんで?

"ResolveLibraryProjectImports" タスクが予期せずに失敗しました。

って何。わけわからん。Xamarinってやっぱ素人には無理なのか。

と思ってエラーの詳細を見ると

System.IO.PathTooLongException: 指定されたパス、ファイル名、またはその両方が長すぎます。完全限定型名は 260 文字未満で指定し、ディレクトリ名は 248 未満で指定してください。

というのを見て、ピーンときた。

昔、Xamarinのセミナーで講師のひとがプロジェクトはCドライブの直下の短い名前のフォルダに短い名前のソリューションにしないといけないみたいなことを言われてたなー。

ということでパスが短くなるようにディレクトリも浅い場所にしてソリューション名も短くしたら普通にビルドが成功しました。