android:MapView无法识别点击
问题描述:
我只是想让一个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!");
}
}
答
在您的地图视图中添加一个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);
}
}
答
我采用了类似于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
}
}
答
我宁愿重写onTap方法。
class MapOverlay extends Overlay
{
@Override
public boolean onTap(GeoPoint p, MapView mapView) {
//DO YOUR STUFF
return super.onTap(p, mapView);
}
}
在onTouch情况下你必须通过你的自我的等待MotionEvent.ACTION_DOWN
和MotionEvent.ACTION_UP
定义标签。 你必须过滤掉MotionEvent.ACTION_MOVE
,以避免在用户刚刚移动地图时做你的东西。
在开发旧版Android版本时,过滤移动事件也会导致问题。当我测试移动事件时,即使我没有移动地图,我的Android 2.3.3手机也会抛出移动事件。所以,我可以不是一个正常的点击之间(向下和向上)(向下,移动和向上)区分和移动
答
我知道这是很老的问题,但:
mMapView.getMap().setOnMapClickListener(new OnMapClickListener()
{
@Override
public void onMapClick(LatLng arg0)
{
android.util.Log.i("onMapClick", "Horray!");
}
});
威尔做的伎俩。
覆盖问题是,我不能称它为“StartActivityForResult”,据我所知。因此,即使我在叠加层中执行了整个“用户点击事件”,我也需要以某种方式触发我的Map活动,以便使用从叠加层接收的数据调用“StartActivityForResult”。 – Ben 2010-12-22 21:43:08
叠加层通常被实现为内部类。因此可以从它们调用Activity方法。看到我编辑的答案。 – kgiannakakis 2010-12-23 08:46:07