Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用无覆盖的ContextMenu创建地图视图_Android_Google Maps_Maps_Android Mapview - Fatal编程技术网

Android 使用无覆盖的ContextMenu创建地图视图

Android 使用无覆盖的ContextMenu创建地图视图,android,google-maps,maps,android-mapview,Android,Google Maps,Maps,Android Mapview,我有一个mapview,我希望在长时间单击时显示一个ContextMenu,但到目前为止,我找到的最接近的解决方案是,我不喜欢这种方法的主要原因是,任何单击都会激活ContextMenu,而不是长时间单击 问题: 有没有一种方法可以在不使用覆盖图的情况下显示地图的上下文菜单?为什么?尝试为mapView编写onKeyLongPress方法可能值得一试。为此,您必须创建另一个扩展MapView的类,然后使用新类代替MapView。只要有一个遵从超级构造函数的默认构造函数。如果您让Eclipse生成

我有一个mapview,我希望在长时间单击时显示一个ContextMenu,但到目前为止,我找到的最接近的解决方案是,我不喜欢这种方法的主要原因是,任何单击都会激活ContextMenu,而不是长时间单击

问题:


有没有一种方法可以在不使用覆盖图的情况下显示地图的上下文菜单?为什么?

尝试为mapView编写onKeyLongPress方法可能值得一试。为此,您必须创建另一个扩展MapView的类,然后使用新类代替MapView。只要有一个遵从超级构造函数的默认构造函数。如果您让Eclipse生成超类构造函数,它将自动为您创建这个


从那里,覆盖onKeyLongPress,让它调用您通常想要显示菜单的任何方法。

onKeyLongPress的意思就是这样。一把钥匙被按下了。您要做的是实现一个GestureListener。下面是一个如何使其工作的示例:


当然,您获得的所有信息都将以像素为单位,因此您需要将其投影到地图空间中以获得lat long。

这是我使用的方法。我创建了一个AbstractMap类,它扩展了MapActivity。在此基础上,我扩展了AbstractMap类,创建了一个适合我需求的映射。注意:我之所以使用这种方法,是因为我的应用程序需要几个属性不同的映射。您可以简单地从AbstractMap中删除Abstract关键字,直接重写该类中的OnTestureListener方法并实例化它

下面是AbstractMap类

public abstract class AbstractMap extends MapActivity implements OnGestureListener, OnDoubleTapListener {

public MapView mapView;
public MapController mapController;
public List<Overlay> mapOverlays;
private GestureDetector detector;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    try {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.mapp);
        detector = new GestureDetector(this, this);
        mapView = (MapView) findViewById(R.id.mapview);
        mapView.setOnTouchListener(otl);
        mapController = mapView.getController();
        mapOverlays = mapView.getOverlays();
    } catch (Exception e) {
        Log.e("Error", "Exception", e);
    }
}

public OnTouchListener otl = new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        if (detector.onTouchEvent(event))
            return true;
        else
            return false;

    }
};
}


希望这对您有所帮助。

您花了时间和精力编写代码以获得指导和帮助,谢谢!!没问题,我很高兴这有帮助。把东西还回去很好。
public class LongPressMap extends AbstractMap {


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}



@Override
public boolean onDown(MotionEvent event) {  

    return false;
}


public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {


    return false;
}


@Override
public void onLongPress(MotionEvent e) {        

}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
        float distanceY) {
    //Log.d("Debug","On Scrtoll");
    // TODO Auto-generated method stub
    return false;
}

@Override
public void onShowPress(MotionEvent e) {


}

@Override
public boolean onSingleTapUp(MotionEvent e) {

    return false;
}

@Override
public boolean onDoubleTap(MotionEvent e) {

    return false;
}

@Override
public boolean onDoubleTapEvent(MotionEvent e) {
    // TODO Auto-generated method stub
    return false;
}

@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
    // TODO Auto-generated method stub
    return false;
}


@Override
protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
}