Google Maps API v2: Wie mache ich Markierungen anklickbar?


128

Wie kann ich die Markierungen in Android Google Maps API v2 anklickbar machen, damit sie entweder ein Menü mit Optionen aufrufen oder einfach eine neue Aktivität starten? Ich glaube, ich habe die Markierungen in meiner App derzeit in einer "Newb" -Methode erstellt. Ich habe ihnen weder einen Namen noch eine Methode zugewiesen, um sie mit dem Rest des erforderlichen Codes zu verknüpfen.

googleMap.addMarker(new MarkerOptions()
        .position(latLng)
        .title("My Spot")
        .snippet("This is my spot!")
        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));

Wenn Sie darauf antworten, geben Sie bitte einen Beispielcode für eine Markierung an, die mit einem eindeutigen Namen eingeführt und dann als anklickbar festgelegt wird, um eine neue Aktivität zu öffnen.

Antworten:


238

Alle Markierungen in Google Android Maps Api v2 können angeklickt werden. Sie müssen Ihrem Marker keine zusätzlichen Eigenschaften zuweisen. Was Sie tun müssen, ist, den Markierungsklick-Rückruf in Ihrer GoogleMap zu registrieren und den Klick innerhalb des Rückrufs zu verarbeiten:

public class MarkerDemoActivity extends android.support.v4.app.FragmentActivity
    implements OnMarkerClickListener
{
    private Marker myMarker;    

    private void setUpMap()
    {
        .......
        googleMap.setOnMarkerClickListener(this);

        myMarker = googleMap.addMarker(new MarkerOptions()
                    .position(latLng)
                    .title("My Spot")
                    .snippet("This is my spot!")
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
        ......
    }

    @Override
    public boolean onMarkerClick(final Marker marker) {

        if (marker.equals(myMarker)) 
        {
            //handle click here
        }
    }
}

Hier ist eine gute Anleitung auf Google zur Anpassung von Markern


9
Gibt es eine Möglichkeit, auf Klicks im Popup-Fenster zu warten? Derjenige, der Ihren Titel / Ausschnitt anzeigt?

40
das gleiche wie bei Markern - Sie müssen sich registrieren OnInfoWindowClickListenerCallback. Es gibt eine Methode in GoogleMap dafür:googleMap.setOnInfoWindowClickListener(listener);
Pavel Dudka

Im Moment funktioniert alles sehr gut. Ich habe festgestellt, dass mein Fehler darin bestand, es nicht früher im Code als Variable festzulegen. Ich habe einfach das ";" und der implementierte Code
Malaka

1
@JDOaktown Sie benötigen diese Prüfung, wenn Sie unterschiedliche Logik für unterschiedliche Marker haben. Nehmen wir an, Sie möchten einen Toast nur anzeigen, wenn auf eine bestimmte Markierung geklickt wird. Wenn Sie die gleiche Handhabungslogik für alle Ihre Marker haben - Sie müssen den Marker nicht überprüfen
Pavel Dudka

1
Wie in der Dokumentation erwähnt ( developer.google.com/android/reference/com/google/android/gms/… ), müssen Sie true zurückgeben, wenn der Klick verbraucht wurde. Wenn Sie false zurückgeben, tritt ein Standardverhalten auf
Pavel Dudka,

36

setTag(position) beim Hinzufügen eines Markers zur Karte.

Marker marker =  map.addMarker(new MarkerOptions()
                .position(new LatLng(latitude, longitude)));
marker.setTag(position);

getTag()auf setOnMarkerClickListenerHörer

map.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
                @Override
                public boolean onMarkerClick(Marker marker) {
                    int position = (int)(marker.getTag());
                   //Using position get Value from arraylist 
                    return false;
                }
            });

4

Vermeiden Sie die Verwendung von Aktivitätsimplementen für OnMarkerClickListener. Verwenden Sie einen lokalen OnMarkerClickListener

// Not a good idea
class MapActivity extends Activity implements OnMarkerClickListener {
}

Sie benötigen eine Karte, um das mit der Markierung verknüpfte Originaldatenmodell nachzuschlagen

private Map<Marker, Map<String, Object>> markers = new HashMap<>();

Sie benötigen ein Datenmodell

private Map<String, Object> dataModel = new HashMap<>();

Fügen Sie einige Daten in das Datenmodell ein

dataModel.put("title", "My Spot");
dataModel.put("snipet", "This is my spot!");
dataModel.put("latitude", 20.0f);
dataModel.put("longitude", 100.0f);

Wenn Sie einen neuen Marker mithilfe eines Datenmodells erstellen, fügen Sie beide zur Maker-Map hinzu

Marker marker = googleMap.addMarker(markerOptions);
markers.put(marker, dataModel);

Verwenden Sie für ein On-Click-Marker-Ereignis einen lokalen OnMarkerClickListener:

@Override
public void onMapReady(GoogleMap googleMap) {
    // grab for laters
    this.googleMap = googleMap;

    googleMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
        @Override
        public boolean onMarkerClick(Marker marker) {
            Map dataModel = (Map)markers.get(marker);
            String title = (String)dataModel.get("title");
            markerOnClick(title);

            return false;
        }
    });

    mapView.onResume();

    showMarkers();

    ZoomAsync zoomAsync = new ZoomAsync();
    zoomAsync.execute();
}

Um das Infofenster anzuzeigen, rufen Sie das ursprüngliche Datenmodell von der Markierungskarte ab:

@Override
public void onMapReady(GoogleMap googleMap) {
    this.googleMap = googleMap;
    googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() {
        @Override
        public void onInfoWindowClick(Marker marker) {
            Map dataModel = (Map)markers.get(marker);
            String title = (String)dataModel.get("title");

            infoWindowOnClick(title);
        }
    });

Was sind die Nachteile der Implementierung von OnMarkerClickListener?
D.Rosado

@ D.Rosado OnMarkerClickListener ist für das Klicken auf die Markierung, OnInfoWindowClickListener für das Klicken auf das Infofenster. Verstehe ich Ihre Frage falsch? Implementieren Sie jede Inline, um die Implementierung im selben Code wie der Setter zu halten.
Gary Davies

3

Eine andere Lösung: Sie erhalten den Marker anhand seines Titels

public class MarkerDemoActivity extends android.support.v4.app.FragmentActivity implements OnMarkerClickListener
{
      private Marker myMarker;    

      private void setUpMap()
      {
      .......
      googleMap.setOnMarkerClickListener(this);

      myMarker = googleMap.addMarker(new MarkerOptions()
                  .position(latLng)
                  .title("My Spot")
                  .snippet("This is my spot!")
                  .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
      ......
      }

  @Override
  public boolean onMarkerClick(final Marker marker) 
  {

     String name= marker.getTitle();

      if (name.equalsIgnoreCase("My Spot")) 
      {
          //write your code here
      }
  }
}

2

Hier ist mein ganzer Code einer Kartenaktivität mit 4 anklickbaren Markierungen. Wenn Sie auf eine Markierung klicken, wird ein Infofenster angezeigt. Nach dem Klicken auf das Infofenster gelangen Sie zu einer anderen Aktivität: Englisch, Deutsch, Spanisch oder Italienisch. Wenn Sie OnMarkerClickListener trotz OnInfoWindowClickListener verwenden möchten, müssen Sie nur diese Zeile tauschen:

mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener()

dazu:

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener()

diese Linie:

public void onInfoWindowClick(Marker arg0)

dazu:

public boolean onMarkerClick(Marker arg0)

und am Ende der Methode "onMarkerClick":

return true;

Ich denke es kann für jemanden hilfreich sein;)

package pl.pollub.translator;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.widget.Toast;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
        Toast.makeText(this, "Choose a language.", Toast.LENGTH_LONG).show();
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener()
        {

            @Override
            public void onInfoWindowClick(Marker arg0) {
                if(arg0 != null && arg0.getTitle().equals("English")){
                Intent intent1 = new Intent(MapsActivity.this, English.class);
                startActivity(intent1);}

                if(arg0 != null && arg0.getTitle().equals("German")){
                Intent intent2 = new Intent(MapsActivity.this, German.class);
                startActivity(intent2);} 

                if(arg0 != null && arg0.getTitle().equals("Italian")){
                Intent intent3 = new Intent(MapsActivity.this, Italian.class);
                startActivity(intent3);}

                if(arg0 != null && arg0.getTitle().equals("Spanish")){
                Intent intent4 = new Intent(MapsActivity.this, Spanish.class);
                startActivity(intent4);}
            }
        });
        LatLng greatBritain = new LatLng(51.30, -0.07);
        LatLng germany = new LatLng(52.3107, 13.2430);
        LatLng italy = new LatLng(41.53, 12.29);
        LatLng spain = new LatLng(40.25, -3.41);
        mMap.addMarker(new MarkerOptions()
                .position(greatBritain)
                .title("English")
                .snippet("Click on me:)"));
        mMap.addMarker(new MarkerOptions()
                .position(germany)
                .title("German")
                .snippet("Click on me:)"));
        mMap.addMarker(new MarkerOptions()
                .position(italy)
                .title("Italian")
                .snippet("Click on me:)"));
        mMap.addMarker(new MarkerOptions()
                .position(spain)
                .title("Spanish")
                .snippet("Click on me:)"));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(greatBritain));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(germany));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(italy));
        mMap.moveCamera(CameraUpdateFactory.newLatLng(spain));
    }
}

1
return true, wenn der Listener das Ereignis konsumiert hat (dh das Standardverhalten sollte nicht auftreten); andernfalls false (dh das Standardverhalten sollte auftreten). Standardmäßig bewegt sich die Kamera zur Markierung und ein Infofenster wird angezeigt.
Ariq

1
Step 1
public class TopAttractions extends Fragment implements OnMapReadyCallback, 
GoogleMap.OnMarkerClickListener

Step 2
gMap.setOnMarkerClickListener(this);

Step 3
@Override
public boolean onMarkerClick(Marker marker) {
    if(marker.getTitle().equals("sharm el-shek"))
        Toast.makeText(getActivity().getApplicationContext(), "Hamdy", Toast.LENGTH_SHORT).show();
    return false;
}

0

Ich habe ein mMap.setOnMarkerClickListener(this);in der onMapReady(GoogleMap googleMap)Methode hinzugefügt . Jedes Mal, wenn Sie auf eine Markierung klicken, wird der Textname in der Toastmethode angezeigt.

public class DemoMapActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener,OnMapReadyCallback, GoogleMap.OnMarkerClickListener {

private GoogleMap mMap;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_places);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
    mapFragment.getMapAsync(this);
}

@Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    double lat=0.34924212701428;
    double lng=32.616554024713;
    String venue = "Capital Shoppers City";
    LatLng location = new LatLng(lat, lng);
    mMap.addMarker(new MarkerOptions().position(location).title(venue)).setTag(0);
    CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLng(location);
    CameraUpdate zoom = CameraUpdateFactory.zoomTo(16);
    mMap.moveCamera(cameraUpdate);
    mMap.animateCamera(zoom);
    mMap.setOnMarkerClickListener(this);
}

@Override
public boolean onMarkerClick(final Marker marker) {
    // Retrieve the data from the marker.
    Integer clickCount = (Integer) marker.getTag();

    // Check if a click count was set, then display the click count.
    if (clickCount != null) {
        clickCount = clickCount + 1;
        marker.setTag(clickCount);
        Toast.makeText(this,
                       marker.getTitle() +
                       " has been clicked ",
                       Toast.LENGTH_SHORT).show();
    }
    // Return false to indicate that we have not consumed the event and that we wish
    // for the default behavior to occur (which is for the camera to move such that the
    // marker is centered and for the marker's info window to open, if it has one).
    return false;
}

}}

Sie können diesen Link als Referenz überprüfen Marker


-4

Ich habe das obige Beispiel bearbeitet ...

public class YourActivity extends implements OnMarkerClickListener
{
    ......

    private void setMarker()
    {
        .......
        googleMap.setOnMarkerClickListener(this);

        myMarker = googleMap.addMarker(new MarkerOptions()
                    .position(latLng)
                    .title("My Spot")
                    .snippet("This is my spot!")
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
        ......
    }

    @Override
    public boolean onMarkerClick(Marker marker) {

       Toast.makeText(this,marker.getTitle(),Toast.LENGTH_LONG).show();
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.