2010-12-22 6 views
3

Ich möchte einfach eine Mapview einen Klick erkennen, um eine andere Aktivität aufzurufen.android: MapView erkennt keine Klicks

Bis jetzt habe ich das reguläre "onClick" ausprobiert, das in normalen Views immer für mich funktionierte, gefolgt von dem Überschreiben von "onTouchEvent" und nicht zuletzt von einem onClickListener.

Ich habe alle drei Möglichkeiten in den folgenden Code. Jede Hilfe wird sehr geschätzt.

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!"); 
    }  
} 

Antwort

6

eine Overlay in Ihrer Kartenansicht hinzufügen und die OnTouchEvent behandeln. so etwas wie dies versucht:

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); 
    } 
} 
+0

Das Problem mit einem Overlay ist, dass ich nicht "StartActivityForResult" daraus, soweit ich weiß, aufrufen kann. Also selbst wenn ich das ganze "where-did-the-user-click-ding" in einem Overlay mache, muss ich meine Map Activity irgendwie auslösen, um "StartActivityForResult" unter Verwendung der Daten aus dem Overlay – Ben

+0

Overlays aufzurufen werden normalerweise als innere Klassen implementiert. Es wird also möglich sein, Activity-Methoden von ihnen aufzurufen. Siehe meine bearbeitete Antwort. – kgiannakakis

+0

Ah, ich verstehe. Ich wusste diese Tatsache über Overlays nicht. Vielen Dank, ich werde es versuchen! – Ben

0

habe ich etwas ähnliches wie kgiannakakis' Antwort, mit einer inneren MapOverlay Klasse, aber ich überlastete die OnTap() -Methode eine Exit_Dialog, um die Aktivität zu schließen. Diese Implementierung ermöglicht weiterhin die Zoom- und Ziehsteuerung auf dem MapView, ohne das Overlay-Steuerelement zu beeinflussen. Sie müssen jedoch mMapView.getContext() in der AlertDialog.Builder-Konstruktion verwenden. Siehe Code:

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 
} 

}  
0

Ich würde es vorziehen, die onTap-Methode zu überschreiben.

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

Im OnTouch Fall müssen Sie durch das Warten auf MotionEvent.ACTION_DOWN und MotionEvent.ACTION_UP eine Registerkarte von Ihrem Selbst definieren. Und Sie müssen die MotionEvent.ACTION_MOVE herausfiltern, um zu vermeiden, Ihre Sachen zu tun, während der Benutzer nur die Karte bewegt.

Die Filterung des Bewegungsereignisses kann zu Problemen bei der Entwicklung älterer Android-Versionen führen. Wie ich getestet habe, wird das Umzugsereignis in mein Android 2.3.3 Telefon geworfen, auch wenn ich die Karte nicht verschoben habe. So konnte ich nicht zwischen einem normalen Klick (nach unten und oben) und eine Bewegung (nach unten bewegen und bis) unterscheiden

10

Ich weiß, es ist ziemlich alte Frage, aber:

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

Will Mache den Trick.

+0

Dies ist die empfohlene Lösung für das neue MapView (gms-Version). – Asim