web-dev-qa-db-fra.com

API Google Maps v2: comment rendre les marqueurs cliquables?

Comment faire en sorte que les marqueurs d'Android Google Maps API v2 deviennent cliquables pour qu'ils ouvrent un menu avec des options ou commencent simplement une nouvelle activité? Je crois que j'ai fait les marqueurs dans mon application actuellement dans une méthode "newb". Je ne leur ai pas attribué de nom ni de méthode pour pouvoir le lier au reste du code requis.

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

Si vous répondez à cela, veuillez inclure un exemple de code d'un marqueur introduit avec un nom unique, puis défini comme cliquable pour ouvrir une nouvelle activité.

108
Malaka

Tous les marqueurs de Google Android Maps Api v2 sont cliquables. Vous n'avez pas besoin de définir d'autres propriétés pour votre marqueur . Ce que vous devez faire - c'est enregistrer un rappel de marqueur sur votre googleMap et gérer le clic dans le rappel:

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

voici un bon guide sur google à propos de la personnalisation des marqueurs

210
Pavel Dudka

setTag(position) lors de l'ajout d'un marqueur à la carte.

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

getTag() sur 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

Évitez d'utiliser Activity implémente OnMarkerClickListener, utilisez un OnMarkerClickListener local

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

Vous aurez besoin d'une carte pour rechercher le modèle de données d'origine lié au marqueur.

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

Vous aurez besoin d'un modèle de données

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

Mettre des données dans le modèle de données

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

Lors de la création d'un nouveau marqueur à l'aide d'un modèle de données, ajoutez les deux à la carte du fabricant.

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

Pour un événement de marqueur de clic, utilisez un OnMarkerClickListener local:

@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();
}

Pour afficher la fenêtre d’information, récupérez le modèle de données original de la carte des marqueurs:

@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

Voici mon code entier d'une activité de carte avec 4 marqueurs cliquables. Cliquez sur un marqueur pour afficher une fenêtre d’information. Après avoir cliqué sur cette fenêtre, vous passez à une autre activité: anglais, allemand, espagnol ou italien. Si vous souhaitez utiliser OnMarkerClickListener malgré OnInfoWindowClickListener, il vous suffit d'échanger cette ligne:

mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener()

pour ça:

mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener()

cette ligne:

public void onInfoWindowClick(Marker arg0)

pour ça:

public boolean onMarkerClick(Marker arg0)

et à la fin de la méthode "onMarkerClick":

return true;

Je pense que cela peut être utile pour quelqu'un;)

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

Une autre solution: vous obtenez le marqueur par son titre 

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