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

如何为android中不同类型的标记指定onMarkerclick(),android,google-maps-android-api-2,Android,Google Maps Android Api 2,在谷歌地图上,我为不同的目的放置了不同颜色的标记,这里我希望每个标记(例如:所有绿色标记)的onMarkerclick()具有不同的功能。如何为此设置条件。下面是我创建一组标记的代码 @Override public void onMapLongClick(LatLng touchlocation) { // TODO Auto-generated method stub googleMap.addMarker(new MarkerOptions() .p

在谷歌地图上,我为不同的目的放置了不同颜色的标记,这里我希望每个标记(例如:所有绿色标记)的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)));
}
这是另一种标记

// adding marker
        user_marker = googleMap.addMarker(new MarkerOptions()
                .position(USER_LOCATION)
                .title("User")
                .snippet("User registered Location:" + loc)
                .icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_ROSE)));
对于附近的地方,我使用另一种类型的标记

// adding marker
        user_marker = googleMap.addMarker(new MarkerOptions()
                .position(USER_LOCATION)
                .title("User")
                .snippet("User registered Location:" + loc)
                .icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_ROSE)));
下面是我如何实现onMarkerClick()的


在这里,我想为每种类型的标记提供不同的功能,以及如何为此编写条件。请帮助我。

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

如果您所有的
标记
都有一个可以区分的值(例如标题),您可以执行以下操作:

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
}
Snippet可用于此目的,但如果不想显示类似于
“用户”
“事件”
“附近位置”
常量的代码段,则必须注意创建信息窗口
视图

一种更通用的方法是将所有
标记
存储在
集合
s中(或者
映射
s,如果您想为每个
标记
分配附加值):

最后但并非最不重要的一点是,您可以使用删除丑陋的
if
语句

为每个
标记
类型创建一个
OnMarkerClickListener
,例如:

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;
    }
};
创建给定类型的
标记
时,分配单击侦听器:

user_marker.setData(userMarkerClickListener);
在您的全局
OnMarkerClickListener
,它被添加到
GoogleMap
对象调用中:

@Override
public boolean onMarkerClick(Marker marker) {
    OnMarkerClickListener listener = (OnMarkerClickListener) marker.getData();
    return listener.onMarkerClick(marker);
}

如果您只有3种
标记
s,我会选择第二种,因为它简单而健壮。如果超过5个或将来可能更改,使用第三个选项创建的面向对象代码将更容易维护IMHO。

您也可以像

   String Title = marker.getTitle();
          Log.e("I am in onMarkerClick" , Title);
    if(Title.equals("Pick Me")){
        Toast.makeText(getBaseContext(),filterAddress,Toast.LENGTH_LONG).show();
        Log.e("I am in onMarkerClick", Title);
    }else if (Title.equals("Drop ME")){
        Log.e("I am in onMarkerClick" , Title);
        Toast.makeText(getBaseContext(),DropoffAdress,Toast.LENGTH_LONG).show();
    }

//标题是标记选项。标题(“您指定的标题”)

我为每个标记创建一个侦听器。这样,我将有一个更有组织性和可维护性的代码

private GoogleMap.OnMarkerClickListener portoAlegreMarkerClickListener = new GoogleMap.OnMarkerClickListener() {
    @Override
    public boolean onMarkerClick(Marker marker) {
        Toast.makeText(getApplicationContext(), "Welcome to Porto Alegre", Toast.LENGTH_SHORT).show();
        return false;
    }
};
然后我创建了标记,在下面的指令中,我将私有侦听器作为标记传递。这起作用了。如果有人知道如何以更好的方式通过听力,请与我们分享

@Override
public void onMapReady(GoogleMap googleMap) {    
    markerPortoAlegre = googleMap.addMarker(new MarkerOptions()
            .position(portoAlegre)
            .title("Porto Alegre"));
    markerPortoAlegre.setTag(portoAlegreMarkerClickListener);
}
最后,我使用
getTag()
创建一个实例来获取全局侦听器。我认为这种方法是一种分别模块化标记侦听的方法,不同于我们使用
googleMap.setonmarkerclicklister(this)
和一个覆盖所有标记的markerclick方法

@Override
public boolean onMarkerClick(Marker marker) {
    GoogleMap.OnMarkerClickListener listener = (GoogleMap.OnMarkerClickListener) marker.getTag();
    //I used listener!=null to avoid an exception
    return listener != null && listener.onMarkerClick(marker);
}

这样,您就必须修改onMapReady,并根据需要多次添加全局侦听器。我写的最后一个方法将始终保持不变。

如何创建标记?我只能通过MarkerOptions添加标记,例如
googleMaps.addMarker(新的MarkerOptions(…)
Scratch。addMarker返回标记,因此set选项工作良好。
@Override
public void onMapReady(GoogleMap googleMap) {    
    markerPortoAlegre = googleMap.addMarker(new MarkerOptions()
            .position(portoAlegre)
            .title("Porto Alegre"));
    markerPortoAlegre.setTag(portoAlegreMarkerClickListener);
}
@Override
public boolean onMarkerClick(Marker marker) {
    GoogleMap.OnMarkerClickListener listener = (GoogleMap.OnMarkerClickListener) marker.getTag();
    //I used listener!=null to avoid an exception
    return listener != null && listener.onMarkerClick(marker);
}