0

私はXamarin.Androidプロジェクトで簡単なGoogleマップを読み込もうとしています。私は自分自身のレンダラーを持っているので、それをアクティビティやxamlやレイアウトを使って追加することはできません(私もフラグメントはありません)。あなたはここに私のコードを見つけることができ、主な問題はOnMapReady()は決して呼び出されません。Show Map in Xamarin.Android、OnMapReady never called

public class AndroidMap:FragmentActivity 
    { 
     private GoogleMap GMap; 
     public AndroidMap() 
     { 
      SetUpMap(); 
     } 
     private void SetUpMap() 
     { 
      var mapFragment = FragmentManager.FindFragmentByTag("map") as MapFragment; 
      if (mapFragment != null) 
       return; 
      var mapOptions = new GoogleMapOptions() 
       .InvokeMapType(GoogleMap.MapTypeHybrid) 
       .InvokeZoomControlsEnabled(enabled: true) 
       .InvokeCompassEnabled(enabled: true); 


      var fragTx = FragmentManager.BeginTransaction(); 
      mapFragment = MapFragment.NewInstance(mapOptions); 
      fragTx.Add(mapFragment, "map"); 
      //if (!IsFinishing && !IsDestroyed) 
      // fragTx.Commit(); 
      var mapReadyCallback = new MyOnMapReady(); 

      mapReadyCallback.MapReady += (sender, args) => 
      { 
       GMap = ((MyOnMapReady)sender).Map;//receive the Map object when completed 
      }; 

      mapFragment.GetMapAsync(mapReadyCallback);   
      while (GMap == null) 
       Thread.Sleep(10); 
      MainView = mapFragment.View; 
     }   
    } 

    public class MyOnMapReady:Java.Lang.Object, IOnMapReadyCallback 
    { 
     public GoogleMap Map { get; private set; } 
     public event EventHandler MapReady; 
     public void OnMapReady(GoogleMap googleMap) 
     { 
      Map = googleMap; 
      var handler = MapReady; 
      if (handler != null) 
       handler(this, EventArgs.Empty);//send the Map object back when completed 
     } 
    } 

いつもヌルである理由を身体が知っていることを感謝します。

+0

に従ってくださいチュートリアル - https://developer.xamarin.com/guides/android/platform_features/maps_and_location/maps/ –

答えて

0

フラグメントトランザクションをコミットしていません。

このようなものは正しい軌道に乗ってあなたを取得する必要があり、あなたがマニフェストに割り当てられたcom.google.android.geo.API_KEYを持っていると仮定すると:

public class AndroidMap : Java.Lang.Object, IOnMapReadyCallback 
{ 
    readonly FragmentActivity activity; 
    public MapFragment mapFragment { get; private set; } 
    public GoogleMap Map { get; private set; } 

    public AndroidMap(FragmentActivity activity) 
    { 
     this.activity = activity; 
     SetUpMap(); 
    } 

    public void OnMapReady(GoogleMap googleMap) 
    { 
     Map = googleMap; 
     // Do something with your GoogleMap/MapFragment 
    } 

    void SetUpMap() 
    { 
     var mapOptions = new GoogleMapOptions() 
      .InvokeMapType(GoogleMap.MapTypeHybrid) 
      .InvokeZoomControlsEnabled(enabled: true) 
      .InvokeCompassEnabled(enabled: true); 
     mapFragment = MapFragment.NewInstance(mapOptions); 

     var fragmentTransaction = activity.FragmentManager.BeginTransaction(); 
     fragmentTransaction.Add(mapFragment, "map"); 
     fragmentTransaction.Commit(); 

     using (var handler = new Handler(Looper.MainLooper)) 
      handler.Post(() => 
      { 
       mapFragment.GetMapAsync(this); 
      }); 
    } 
} 

FragmentActivityインスタンスに渡すことによってインスタンスを作成します。

map = new AndroidMap(this); 
+0

ありがとうございました。はい私はコミットラインを削除しました。私はこのエラーがあります:Java.Lang.IllegalStateException:アクティビティが破損しました System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() –

+0

@ KarvanJafiあなたの 'FragmentManager'が有効なタイプではないためにエラーが発生しました。 'アクティビティ'私の例で私がそれをやっているのを見てください... – SushiHangover

+0

私は参照してください。確かに、私のアプリケーションにはフラグメントとXAMLビューはありません。私はそれ自身の中にマップを持っているAndroid.Viewを作成したいだけです。それをレンダラーに渡して、MainActivityでそれを描画します。/今、私はすべて、ラベル、画像、ビデオなどをレンダリングします。唯一欠けている項目はMapです。そのため私はFragmentActivityを継承し、契約者のAndroidMap(this)を呼び出します。まだ成功していない –