0

我有一個FragmentActivity,我試圖加載谷歌地圖。它實現了OnMapReadyCallBack,當我嘗試膨脹地圖時,我得到了mapFragment對象,但調用getMapAsync後應用程序崩潰。下面是我的代碼:onMapReady未被調用:Google地圖在FrgmentActivity中:Android Studio

public class MapActivity extends FragmentActivity implements OnMapReadyCallback { 

    private GoogleMap googleMap; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_map); 

    initializeMap(); 
    } 

    private void initializeMap() { 
     if (googleMap == null) { 
      SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.map); 
      if(mapFragment!=null){ 
       mapFragment.getMapAsync(MapActivity.this); 
      } 

      // check if map is created successfully or not 
      if (null== googleMap) { 
       Toast.makeText(getApplicationContext(), "Sorry! unable to create maps", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } 

    @Override 
    public void onMapReady(GoogleMap map) { 
     googleMap = map; 
     googleMap.setMyLocationEnabled(true); 
    } 
} 

我試圖degug和我注意到,我收到mapFragment對象,但它從來沒有達到onMapReady方法,這使得我的GoogleMap對象爲空和應用程序崩潰時的任何方法有關googleMap(例如setOnCameraChangeListener)正在被調用。我已經通過了documentation page,但它似乎不適用於我的項目。

有沒有什麼我可能會在我的項目中失蹤?我應該如何克服這個錯誤,並停止應用程序崩潰。

TIA

編輯1:

下面是我在XML文件中的地圖片段

<fragment 
    android:id="@+id/map" 
    class="com.google.android.gms.maps.SupportMapFragment" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MapsActivity" 
    android:name="com.google.android.gms.maps.SupportMapFragment"/> 
+0

您能否顯示您的R.layout.activity_map? – AlexTa

+0

檢查我在問題中的編輯。 –

回答

2

提示是getMapAsync(asynchronous)

onMapReady不是直接調用,這意味着googleMap將不會被設置,直到方法被調用。

編輯:在設置地圖值之前,確保您沒有在googleMap上執行方法調用,即在運行方法之前添加檢查是否爲空。如果您缺少空檢查,Android工作室會提醒您,同時將@Nullable註釋添加到private GoogleMap googleMap;它將有助於開發。

+0

那麼,我應該如何重新排列我的代碼才能使其工作。因爲我已經在onMapReady中啓動googleMap對象。 –

+0

確保在設置之前沒有使用'googleMap',當'googleMap'不爲空時記得沒有任何保證 – Ryan

+0

感謝ryan。在googleMap上檢查null幫助我糾正錯誤。請檢查我的答案,我是如何刪除錯誤的。 –

0

mapFragment.getMapAsync(MapActivity.this);機構中的地圖將被加載異步的,如果加載完成後回調到onMapReady()會被製造。

以下代碼可能不起作用,因爲地圖尚未完成加載。您應該在onMapReady()方法中設置地圖,而不是在initializeMap()之內。

if (null == googleMap) { // googleMap will still be null here 
    Toast.makeText(getApplicationContext(), "Sorry! unable to create maps", Toast.LENGTH_SHORT).show(); 
} 
+0

那麼,我應該如何重新排列我的代碼才能使其工作。因爲我已經在onMapReady中啓動了googleMap對象,所以不是在那之前。 –

0

好吧。我得到了解決方案。我將與googleMap有關的方法(即setOnCameraChangeListener)移動到onCreate中早先調用的onMapReady。 onCreate中的googleMap對象爲null,導致應用程序崩潰。

+0

這樣一個醜陋的黑客! – AlexTa

+0

是的。我在這方面掙扎了兩天,這個簡單的黑客解決了它 –