前回の記事でご紹介したGoogleMapsですが、初期表示でローマがフォーカスされてしまいます。

現場でこのケースに遭遇した時は「全ての道はローマに通ず」とか言って楽しんでましたが、いざカスタマイズしようとして結構苦労した記憶があります。

ちなみにこれ、今の今まで知らなかったんですが、Xamarin標準のMapsがローマをフォーカスしてしまうらしいですね。

(参考:Summary of Chapter 28. Location and maps

 

今回はPrismを利用してMVVMパターンによる暫定解決策(回避策の方が正しいか?)をご紹介します。

前回のプロジェクトをそのまま使っていきます。

『Xamarin.Forms.GoogleMaps.Bindings』のNugetパッケージ取得

まず『Xamarin.Forms.GoogleMaps』ですが、そのままではMVVMパターンでの実装が不可能です。

※バインディングできません、MVVMパターンにできません。

開発の際は最初愕然としましたが、調べてみたらなんとデータバインディング用のパッケージをリリースしていらっしゃる方がいました。

(参考:Xamarin.Forms.GoogleMaps用のBinding拡張ライブラリをリリースしました

ということで早速パッケージをインストールしていきます。

作成者の欄を見て頂くと『Xamarin.Forms.GoogleMaps』の開発者である「amay077」さんの名前も載っていますね。

インストール後はAndroidプロジェクトのMainActivityにパッケージの初期化コードを追加します。

XAMLのGoogleMapsにビヘイビアを追加

GoogleMapsの表示位置を変更するには「MoveToRegionBehavior」を使用します。

余談ですが、開発当初は「MoveCameraBehavior」が表示位置の変更だろうと思ってかなり苦労した記憶があります。

画面遷移時に表示位置の変更を行う

ここからが今回の記事の本旨になりますが、前述の通りGoogleMapsの初期表示位置はローマになります。

これをどう解決していくか、というところで最初はViewModelのコンストラクタでやっちゃおうかと思ったんですが、そもそも画面が初期化されていない状態ではできないんですよね…。

ということで『Prism』の「OnNavigatedTo」メソッドを利用しました。

「OnNavigatedTo」メソッドの簡単な説明をしておくと、「当該画面遷移時の処理」で「コンストラクタの後に動き」ます。

(参考:Prism for Xamarin.Forms Navigationイベント詳細 NavigationPage編

実行してみると初期表示位置がローマから兵庫県へと変わりました。

※明石市じゃないことにびっくりしたのは内緒です。

まとめ

『Xamarin.Forms.GoogleMaps』でローマが初期表示されてしまう問題のMVVMパターンによる回避策として

『Prism』の「OnNavigatedTo」メソッドで初期表示位置を変更する。

MVVMパターンでの実装を行うには『Xamarin.Forms.GoogleMaps.Bindings』を利用しましょう。

以上です。

スポンサーリンク