2013-05-11 4 views
9

Ich mache eine Anwendung mit einem Google Maps darauf, für Android. Ich habe viele Marker auf meinem Bildschirm und bereite für jeden Marker einen anpassbaren Ballon vor, wenn sie angeklickt werden. Das heißt, ich habe Informationen, die sich nach dem Marker unterscheiden, auf den geklickt wurde.Woher weiß man, welcher Marker in Google Maps v2 für Android angeklickt wurde?

Ich habe den Inhalt der Ansicht des Markers mit setInfoWindowAdapter eingerichtet und dann überschreibe ich die Methode getInfoContents.

Das Problem ist: Diese Methode ist die allgemeine Implementierung des Inhalts des Info-Fensters, aber jeder Marker soll seine eigenen Informationen zeigen. So weit ich es verstanden habe, muss ich irgendwie auf getInfoContents (Markermarker) erkennen, welche der Marker angeklickt wurden, um aus meinen Datenstrukturen die notwendigen Informationen zu laden, die im Infofenster angezeigt werden. Die Frage ist: Wie identifiziere ich, welche Entität der angeklickte Marker 'Marker' darstellt? ich meine, nur mit dem Objekt Marker auf getInfoContents, die ausgelöst wurde, um das Info-Fenster anzuzeigen, wie kann ich erkennen, welche die richtigen Informationen angezeigt werden? Ich habe zwar den String Title mit marker.getTitle() verglichen, aber dies zwingt mich, einen Titel im Infofenster anzuzeigen, den ich nicht möchte. Es gibt auch eine marker.getId(), aber solche ID wird von der API generiert und ich kann es nicht steuern

Irgendwelche Ideen?

Antwort

0

versuchen diesen Code:

@Override 
    public void onInfoWindowClick(final Marker marker) 
    { 
     // TODO Auto-generated method stub 
     if (marker.getTitle().equalsIgnoreCase("Start")) { 
     Toast.makeText(showMaps.this, "You have click on start -->", 
       Toast.LENGTH_LONG).show(); 
     Log.e("marker.getPosition()-->", "" + marker.getPosition()); 
     } 
    } 
3

Sie nicht Titel zu zeigen, sind verpflichtet, wenn Sie es eingestellt haben, so können Sie das und so lange, wie Sie eine View von getInfoContents und nicht setText auf jedem subview zurückkehren können von das gab View mit Titelwert zurück.

Je nachdem, wie und wenn Sie bereits Verweise auf alle Marker halten, gibt es Alternativen, z. Wenn Sie List<Marker> policeMarkers und List<Marker> badGuysMarkers hatten, können Sie eine bedingte if (policeMarkers.contains(marker)) { ... } else { ... } verwenden.

Sie können auch eine Map<Marker, YourMarkerRelatedDataModel> allMarkers behalten und YourMarkerRelatedDataModel model = allMarkers.get(marker); tun und diesen Wert verwenden, um zu unterscheiden.

Schließlich können Sie Android Maps Extensions verwenden, welche Funktionen wie Marker.setData(Object) und Object Marker.getData() zu halten Ihr Modell der Nähe Ihrer Marker und nicht zu schaffen Dinge wie Map<Marker, Model> hinzufügt.

18

In Antwort auf:

Die Frage ist: Wie kann ich feststellen, welche Einheit der 'Marker' geklickt Marker repräsentiert? [...] Es gibt auch eine marker.getId(), aber solche ID wird durch die API erzeugt und ich kann es nicht

steuern Sie es steuern können. Der Marker wird von addMarker() zurückgegeben, sodass Sie seine ID abrufen und speichern können. Hier ist der Code:

Map <String, Integer> mMarkers = new HashMap<String, Integer>(); 

...

MarkerOptions mo = new MarkerOptions() 
.icon(BitmapDescriptorFactory.fromResource(R.drawable.my_marker)) 
.position(new LatLng(mLat, mLon)) 
.flat(true) 
.snippet("Click here for details") 
.rotation(0) 
.title(title); 

Wenn Sie die Markierung auf der Karte hinzufügen, speichern die ID auf dem Behälter

Marker mkr = map.addMarker(mo); 
mMarkers.put(mkr.getId(), myObject.getId()); 

Dann, wenn die Markierung geklickt wird, können Sie die ID von „myObject“ recover wie diese

map.setOnInfoWindowClickListener(new OnInfoWindowClickListener() { 
    public void onInfoWindowClick(Marker marker) { 
     int id = mMarkers.get(marker.getId()); 
     // Do stuff with the id       
    } 
}); 
+0

Es ist in meinem Fall funktioniert .. +1 – Pihu

0

Es ist eine bessere Option, und das ist, was google schlägt vor:

Tag: Ein Object mit dem Marker verbunden. Zum Beispiel kann die Object Daten darüber enthalten, was der Marker darstellt. Dies ist einfacher als das Speichern eines separaten Map<Marker, Object>. Als ein weiteres Beispiel können Sie eine String ID, die der ID entspricht, aus einem Datensatz zuordnen. Google Maps Android API liest und schreibt diese Eigenschaft weder.

Source

So können Sie etwas tun:

for (ListItem it: mList) { 
    Marker mk = mMap.addMarker(new MarkerOptions().position(it.getLatLng()).title(it.getName()).snippet(it.getAddress())); 
    mk.setTag(it.getID()); 
} 

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 
    @Override 
    public boolean onMarkerClick(Marker marker) { 
     Integer id = (Integer) marker.getTag(); 
     return false; 
    } 
}); 
Verwandte Themen