it-swarm.com.de

Google Maps API v2: Wie lassen sich Marker anklickbar machen?

Wie kann ich die Markierungen in Android Google Maps API v2 anklickbar machen, sodass 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 keinen Namen oder keine Methode zugewiesen, um sie mit dem restlichen Code zu verlinken.

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

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

108
Malaka

Alle Marker in Google Android Maps Api v2 sind anklickbar. Sie müssen keine zusätzlichen Eigenschaften für Ihre Markierung festlegen. Was Sie tun müssen, ist das Registrieren der Markierung, klicken Sie auf den Callback für Ihre googleMap und behandeln Sie den Klick innerhalb des Rückrufs:

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 ein guter guide von google über marker-anpassung

210
Pavel Dudka

setTag(position) beim Hinzufügen einer Markierung zur Karte.

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

getTag() auf setOnMarkerClickListener Listener

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

Vermeiden Sie die Verwendung von Activity implementiert 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 ursprüngliche Datenmodell abzurufen

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 mit einem Datenmodell erstellen, fügen Sie beide zur Herstellerkarte hinzu

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

Verwenden Sie für das On-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 aus 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);
        }
    });
3
Gary Davies

Hier ist mein gesamter Code einer Kartenaktivität mit 4 anklickbaren Markern. Wenn Sie auf eine Markierung klicken, wird ein Infofenster angezeigt, und nach dem Klicken auf 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 vertauschen:

mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener()

zu diesem:

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener()

diese Linie:

public void onInfoWindowClick(Marker arg0)

zu diesem:

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
Pysia93

Eine andere Lösung: Sie erhalten den Marker durch seinen Titel 

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
    }
}

}

0
Osama Ibrahim