2014-11-04 14 views
3

在Xamarin的Android,創造MapFragment,該代碼顯示的地圖,但mapFragment.Map始終爲空,我不能設置地圖類型Android的谷歌xamarin是MapFragment.Map空

代碼:

var mapFragment = MapFragment.NewInstance (mapOptions); 
FragmentTransaction tx = FragmentManager.BeginTransaction(); 
tx.Add(Resource.Id.map_fragment_container, mapFragment); 

map = mapFragment.Map; 
if (map != null) { 
    map.MapType = GoogleMap.MapTypeNormal;//never comes to this line 
} 
tx.Commit(); 

XML:

<FrameLayout 
    android:id="@+id/map_fragment_container" 
    android:orientation="horizontal" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

回答

1

的原因是地圖視圖並沒有在該點創建調用

所以我在訪問mapFragment.Map之前使用了500毫秒的延遲;

handler.PostDelayed (UpdateMap, 500); 


    void UpdateMap() 
    { 
     map = mapFragment.Map; 
     if (map != null) { 
      map.MapType = GoogleMap.MapTypeNormal; 
      map.MoveCamera(cameraUpdate); 
      return; 
     } 

     handler.PostDelayed(UpdateMap, 500); 
    } 
+1

這是一個**非常糟糕的主意,不要使用延遲形式的時間段,因爲它是不可靠的。檢查文檔是否是異步操作(我懷疑)是否應該等待它完成,否則就會出現其他問題,並設置一個意外幫助的「超時」。 – 2014-11-05 16:54:21

+0

@ Alex.F謝謝您的回覆,您能否爲我的問題建議我一個更好的解決方案? – 2014-11-06 12:38:45

+0

我有同樣的問題。我通過在onResume中重新調用地圖創建來進行修復。有時地圖不是空的,但如果你在onCreate中進行檢查,然後在onResume中重試它的工作。讓我知道你是否想要一個代碼示例,但是它在當前的Xamarin Droid示例中以這種方式處理 – 2015-03-13 09:58:06

1

我把片斷創建代碼的OnCreate和地圖設置中的onResume,類似的東西(從摘錄的onResume,使用任何選項,找到你喜歡的片段或當您創建存儲的實例):

  if (map == null) 
      { 
       if (mapFragment == null) 
       { 
        mapFragment = ChildFragmentManager.FindFragmentByTag("map") as MapFragment; 
       } 


       map = mapFragment.Map; 

       if (map != null) 
       { 
        .... 
0

如果你調用MapFragment.NewInstance (mapOptions)活動的OnCreate那麼你可以擴展MapFragment並覆蓋OnActivityCreated其中地圖應該已經被初始化。
由於服務本身可能不可用,因此您仍應該檢查它是否爲null

這個問題已被討論和解釋得很好here