2010-12-22 84 views
3

我只是想让一个mapview识别点击,以便调用另一个活动。android:MapView无法识别点击

到现在为止,我尝试了常规的“onClick”,它总是在常规视图中为我工作,然后覆盖“onTouchEvent”,最后但并非最不重要的使用onClickListener。

我把所有三种方式放到下面的代码中。任何帮助,高度赞赏。

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

回答

6

在您的地图视图中添加一个Overlay并处理OnTouchEvent。尝试是这样的:

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

覆盖问题是,我不能称它为“StartActivityForResult”,据我所知。因此,即使我在叠加层中执行了整个“用户点击事件”,我也需要以某种方式触发我的Map活动,以便使用从叠加层接收的数据调用“StartActivityForResult”。 – Ben 2010-12-22 21:43:08

+0

叠加层通常被实现为内部类。因此可以从它们调用Activity方法。看到我编辑的答案。 – kgiannakakis 2010-12-23 08:46:07

0

我采用了类似于kgiannakakis的回答的东西,与内MapOverlay类,但我重载OnTap中()方法来提供Exit_Dialog倒闭活动。该实现仍然允许在MapView上进行缩放和拖动控制,而不会影响Overlay控件。但是您必须在AlertDialog.Builder构造中使用mMapView.getContext()。见代码:

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

我宁愿重写onTap方法。

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

在onTouch情况下你必须通过你的自我的等待MotionEvent.ACTION_DOWNMotionEvent.ACTION_UP定义标签。 你必须过滤掉MotionEvent.ACTION_MOVE,以避免在用户刚刚移动地图时做你的东西。

在开发旧版Android版本时,过滤移动事件也会导致问题。当我测试移动事件时,即使我没有移动地图,我的Android 2.3.3手机也会抛出移动事件。所以,我可以不是一个正常的点击之间(向下和向上)(向下,移动和向上)区分和移动

10

我知道这是很老的问题,但:

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

威尔做的伎俩。