2015-09-27 85 views
0

我的Android上有一個Google地圖,我是新的Google Maps API的新手。它上面有一個初始標記。 這是顯示地圖和初始標記方法:是否可以從AsyncTask添加標記?

@Override 
    public void onMapReady(GoogleMap map) { 
     //map is ready 
     // latitude and longitude 
     double latitude = latitud_del_hotel; 
     double longitude =longitud_del_hotel; 

     // create marker 
     MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude)).title(nombre_del_hotel).icon(BitmapDescriptorFactory.fromResource(R.drawable.poi)); 

     // Changing marker icon 
     // marker.icon(BitmapDescriptorFactory 
     // .defaultMarker(BitmapDescriptorFactory.HUE_ROSE)); 

     // adding marker 
     map.addMarker(marker); 
     map.setMapType(GoogleMap.MAP_TYPE_HYBRID); 
     CameraPosition cameraPosition = new CameraPosition.Builder() 
       .target(new LatLng(latitud_del_hotel, longitud_del_hotel)).zoom(15).build(); 
     map.animateCamera(CameraUpdateFactory 
       .newCameraPosition(cameraPosition)); 
    } 

現在,我需要把其他標記就可以了。這些標記是JSON對象,我從活動的另一個方法檢索。

可能是我的問題很愚蠢,但我不知道如何在同一個地圖上添加標記,但是在另一個方法上創建標記。

這就是爲什麼我在創造另一種方法一個新的標誌:

hotel.setNombre(obj.getString("nombre_hotel")); 
             hotel.setLatitud(obj.getDouble("latitud_hotel")); 
             hotel.setLongitud(obj.getDouble("longitud_hotel")); 
             hotel.setDireccion(obj.getString("direccion_hotel")); 

             String nombre = obj.optString("nombre_hotel"); 
             Log.d("NOMBRE=", nombre); 

             String latitud = obj.optString("latitud_hotel"); 
             double latitud_del_hotel = Double.parseDouble(latitud); 

             String longitud = obj.optString("longitud_hotel"); 
             double longitud_del_hotel = Double.parseDouble(longitud); 

             // create marker 
             MarkerOptions marker = new MarkerOptions().position(new LatLng(latitud_del_hotel, longitud_del_hotel)).title(nombre).icon(BitmapDescriptorFactory.fromResource(R.drawable.poi)); 


             map.addMarker(marker); 

但很明顯,該行map.addMarker(marker);顯示警告:無法解析符號映射。

對不起,如果它很容易解決,但我不能。

謝謝。

回答

3

在您的onMapReady(...)添加一個字段引用到返回的地圖。

public void onMapReady(GoogleMap map) { 
    this.googleMap = map; 

然後,你可以這樣做:

// create marker 
if(this.googleMap != null) { 
    MarkerOptions marker = new MarkerOptions(...); 
    this.googleMap.addMarker(marker); 
} 

這可能創造了所謂的競爭條件 - 如果你的網絡調用來檢索酒店的位置信息之前,地圖是準備返回一個結果,你會永遠不會將結果添加到地圖中。

你可以這樣做解決這個問題:

// Create this as a field: 
List<MarkerOptions> markerOptions = new ArrayList<>(); 

MarkerOptions marker = new MarkerOptions(...); 
if(this.googleMap != null) { 
    this.googleMap.addMarker(marker); 
} else { 
    this.markerOptions.add(marker); 
} 

然後,在onMapReady的底部(...):

if(this.markerOptions != null && !this.markerOptions.isEmpty()) { 
    for(MarkerOption markerOption : this.markerOptions) { 
     this.googleMap.addMarker(markerOption); 
    } 
} 
+0

感謝@jyanks,地圖在onCreateView方法創建的JSON調用在onCreateView上創建。 – mvasco

+0

是的,所以你需要在volley調用返回後onMapReady完成時捕獲MarkerOptions。 – jyanks

+0

我應該如何首先定義googleMap? – mvasco

相關問題