0

Я пытаюсь загрузить простую карту google в проекте Xamarin.Android. У меня есть собственный рендерер, поэтому я не могу добавить это в Activity или через xaml или layout (у меня тоже нет фрагментов). Здесь вы можете найти мой код, и основная проблема: OnMapReady() никогда не звонил.Показать карту в Xamarin.Android, OnMapReady никогда не вызывал

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: активность была уничтожена at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() –

+0

@KarvanJafi. Вы получаете эту ошибку из-за того, что ваш 'FragmentManager' не находится на допустимом типе 'Activity'. Посмотрите, как я это делаю в своем примере ... – SushiHangover

+0

Я вижу. Спасибо за ответ. На самом деле у меня нет никакого фрагмента и представления XAML в моем приложении. Я просто хочу создать Android.View, который имеет карту внутри себя. и передайте это визуализатору и нарисуйте это в моей MainActivity/Now, я все визуализую, Label, Image, Video и .... единственным отсутствующим элементом является Map. для этого я наследую от FragmentActivity и вызываю AndroidMap (это) у подрядчика. но до сих пор нет успеха –