如何在android中为不同类型的标记指定onMarkerclick()

3 android google-maps-android-api-2

在谷歌地图上我为不同的目的放置不同颜色的标记,在这里我想要onMarkerclick()的每个标记的不同功能(例如:所有绿色标记).如何为此创建条件.我的代码创建一个集合标记

@Override
public void onMapLongClick(LatLng touchlocation) {
    // TODO Auto-generated method stub
    googleMap.addMarker(new MarkerOptions()
            .position(touchlocation)
            .title("Event")
            .icon(BitmapDescriptorFactory
                    .defaultMarker(BitmapDescriptorFactory.HUE_GREEN)));
}
Run Code Online (Sandbox Code Playgroud)

这里是另一种类型的标记

// adding marker
        user_marker = googleMap.addMarker(new MarkerOptions()
                .position(USER_LOCATION)
                .title("User")
                .snippet("User registered Location:" + loc)
                .icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_ROSE)));
Run Code Online (Sandbox Code Playgroud)

对于附近的地方,我正在使用其他类型的标记

我在这里如何实现onMarkerClick()

@Override
public boolean onMarkerClick(Marker marker) {
    // TODO Auto-generated method stub
    // googleMap.clear();
    Toast.makeText(getApplicationContext(), "USER MARKER",
            Toast.LENGTH_LONG).show();
    showDialog(DIALOG_LOGIN);

    return true;
}
Run Code Online (Sandbox Code Playgroud)

在这里,我希望每种类型的标记都有不同的功能,如何为它写一个条件.帮助我.

Mac*_*ski 7

有几种方法可以做到这一点.

如果您Marker的所有s都有值,您可以区分(例如标题),您可以这样做:

String title = marker.getTitle();
if ("User".equals(title)) {
    // show dialog
} else if ("Event".equals(title)) {
    // do thing for events
} else {
    // do thing for nearby places
}
Run Code Online (Sandbox Code Playgroud)

可以使用代码片段,但View如果您不想显示片段或常量"USER",则必须注意创建信息窗口."EVENT""NEARBY_PLACE"

更通用的方法可能是将所有Markers 存储在Sets中(Map如果要为每个分配额外的值,则为s Marker):

private Set<Marker> events;
private Set<Marker> nearbyPlaces;
Run Code Online (Sandbox Code Playgroud)

然后检查点击Marker是否在其中一个集合中:

if (user_marker.equals(marker)) {
    // show dialog
} else if (events.contains(marker)) {
    // do thing for events
} else if (nearbyPlaces.contains(marker)) {
    // do thing for nearby places
} else {
    // something is wrong, better call police (assuming there are only 3 kinds of markers)
}
Run Code Online (Sandbox Code Playgroud)

最后但并非最不重要的是,您可以使用Android Maps Extensions删除丑陋的if语句.

OnMarkerClickListener为每种Marker类型创建一个,例如:

private OnMarkerClickListener userMarkerClickListener = new OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(Marker marker) {
        // show dialog
        return true;
    }
};

private OnMarkerClickListener eventMarkerClickListener = new OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(Marker marker) {
        // do thing for events
        return false;
    }
};
Run Code Online (Sandbox Code Playgroud)

创建Marker给定类型时,指定单击侦听器:

user_marker.setData(userMarkerClickListener);
Run Code Online (Sandbox Code Playgroud)

在你的全局中OnMarkerClickListener,它被添加到GoogleMap对象调用中:

@Override
public boolean onMarkerClick(Marker marker) {
    OnMarkerClickListener listener = (OnMarkerClickListener) marker.getData();
    return listener.onMarkerClick(marker);
}
Run Code Online (Sandbox Code Playgroud)

如果你只有3种Markers,我会选择第二种选择,因为它简单而强大.如果将来有超过5个或可能更改,使用第三个选项创建的面向对象代码将更容易维护恕我直言.