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é.
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
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;
}
});
É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);
}
});
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));
}
}
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
}
}
}