Android: MapView no reconoce los clics

Simplemente quiero que un mapa reconozca un clic, para llamar a otra actividad.

Hasta ahora, he probado el regular "onClick", que siempre funcionó para mí en las vistas regulares, seguido de sobrescribir "onTouchEvent" y por último, pero no menos importante con un onClickListener.

Salgo de las tres maneras en el siguiente código. Cualquier ayuda es muy apreciada.

import com.google.android.maps.MapActivity; import com.google.android.maps.MapView; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; public class HelloMapView extends MapActivity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { final MapView map; super.onCreate(savedInstanceState); setContentView(R.layout.main); map = (MapView) findViewById(R.id.mapview); map.setOnClickListener(new MapView.OnClickListener() { public void onClick(View v){ System.out.println("I listened!"); } }); } @Override protected boolean isRouteDisplayed() { return false; } @Override public boolean onTouchEvent(MotionEvent arg0) { System.out.println("onTouchEvent happened!"); super.onTouchEvent(arg0); return super.onTouchEvent(arg0); } public void onClick(){ System.out.println("onClick entered!"); } } 

Agregue una superposición en su vista de mapa y maneje el OnTouchEvent. Intente algo como esto:

 public class MyMapActivity extends MapActivity { class MapOverlay extends com.google.android.maps.Overlay { @Override public boolean onTouchEvent(MotionEvent e, MapView mapView) { if (e.getAction() == MotionEvent.ACTION_UP) { GeoPoint p = mapView.getProjection().fromPixels( (int) e.getX(), (int) e.getY()); MyMapActivity this.startActivityForResult(intent, requestCode); } return false; } } // MyMapActivity methods @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mapView = (MapView) findViewById(R.id.mapview); MapOverlay mapOverlay = new MapOverlay(); List<Overlay> listOfOverlays = mapView.getOverlays(); listOfOverlays.clear(); listOfOverlays.add(mapOverlay); } } 

Sé que es bastante vieja pregunta, pero:

 mMapView.getMap().setOnMapClickListener(new OnMapClickListener() { @Override public void onMapClick(LatLng arg0) { android.util.Log.i("onMapClick", "Horray!"); } }); 

Hará el truco.

Utilicé algo similar a la respuesta de kgiannakakis, con una clase MapOverlay interna, pero sobrecargé el método OnTap () para proporcionar un Exit_Dialog para cerrar la actividad. Esta implementación todavía permite el control de zoom y arrastre en el MapView sin afectar al control de superposición. Pero debe utilizar mMapView.getContext () en la construcción AlertDialog.Builder. Ver código:

 public class TripDataMapActivity extends MapActivity { .... @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mapview_activity); // Set result CANCELED in case the user backs out setResult(Activity.RESULT_CANCELED); mMapView = (MapView)findViewById(R.id.mapview); mMapView.setBuiltInZoomControls(true); mMapCntrl = mMapView.getController(); mMapCntrl.setZoom(14); // World View is Zoom 1 // Set-up Drawable Overlays mMapOverlays = mMapView.getOverlays(); mMapOverlays.clear(); mDrawable = this.getResources().getDrawable(R.drawable.direction_arrow); mItemizedOverlay = new MyItemizedOverlays(mDrawable); updateMapView(); } ..... protected void updateMapView() { // Convert Location into GeoPoint. int lat = (int)(locatn.getLatitude() * 1E6); int lng = (int)(locatn.getLongitude() * 1E6); GeoPoint point = new GeoPoint(lat, lng); OverlayItem overlayitem = new OverlayItem(point, "someTitle!", "someSnippet!"); mMapCntrl.setCenter(point); mItemizedOverlay.addOverlay(overlayitem); mMapOverlays.add(mItemizedOverlay); mMapView.invalidate(); } .... // Inner Class Implementation class MyItemizedOverlays extends ItemizedOverlay<OverlayItem> { private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); public MyItemizedOverlays(Drawable defaultMarker) { super(boundCenterBottom(defaultMarker)); } @Override protected OverlayItem createItem(int ith) { return mOverlays.get(ith); } @Override public int size() { return mOverlays.size(); } public void addOverlay(OverlayItem overlay) { mOverlays.add(overlay); populate(); // will call createItem(int) above } @Override protected boolean onTap(int index) { // EXIT Dialog AlertDialog.Builder exitDialog = new AlertDialog.Builder(mMapView.getContext()); exitDialog.setMessage("Are you sure you want to Exit?") .setCancelable(false) .setPositiveButton("Yes", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { Intent intent = new Intent(); //intent.putExtra(EXTRA_DEVICE_ADDRESS, address); // Set result and finish this Activity setResult(Activity.RESULT_OK, intent); TripDataMapActivity.this.finish(); } }).setNegativeButton("No", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { dialog.cancel(); } }); exitDialog.show(); return true; } // End of Inner Class } } 

Preferiría anular el método onTap.

 class MapOverlay extends Overlay { @Override public boolean onTap(GeoPoint p, MapView mapView) { //DO YOUR STUFF return super.onTap(p, mapView); } } 

En el evento onTouch, debe definir una pestaña por su cuenta esperando MotionEvent.ACTION_DOWN y MotionEvent.ACTION_UP . Y tienes que filtrar el MotionEvent.ACTION_MOVE para evitar hacer tus cosas mientras el usuario mueve el mapa.

El filtrado del evento de movimiento también puede provocar problemas al desarrollar versiones Android más antiguas. Como probé el evento de movimiento se lanzará en mi teléfono Android 2.3.3, incluso cuando no se movió el mapa. Así que no podía distinguir entre un clic normal ( hacia abajo y hacia arriba ) y un movimiento ( hacia abajo, mover y subir )

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.