4

在谷歌地图上,我为不同目的放置不同颜色的标记,在这里我希望每个标记的 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)));

对于附近的地方,我正在使用另一种类型的标记

这里我是如何实现 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;
}

在这里,我想要每种类型的标记都有不同的功能,如何为此编写条件。帮助我。

4

3 回答 3

7

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

如果你所有的Markers 都有一个你可以区分的值(例如标题),你可以这样做:

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 可用于此,但View如果您不想显示像"USER""EVENT""NEARBY_PLACE"常量这样的片段,则必须注意创建信息窗口。

一种更通用的方法可能是将所有Markers 存储在Sets 中(或者Maps 如果您想为 each 分配附加值Marker):

private Set<Marker> events;
private Set<Marker> nearbyPlaces;

稍后检查 clickedMarker是否在这些集合之一中:

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)
}

最后但同样重要的是,您可以使用Android 地图扩展来删除丑陋的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;
    }
};

创建Marker给定类型时,分配点击侦听器:

user_marker.setData(userMarkerClickListener);

在您的 globalOnMarkerClickListener中,它被添加到GoogleMap对象调用中:

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

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

于 2013-10-05T11:12:31.853 回答
0

我为每个标记创建一个监听器。这样我将有一个更有条理和可维护的代码。

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.setOnMarkerClickListener(this)对所有标记使用单个覆盖方法 onMarkerClick 不同。

@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 并根据标记需要多次添加全局侦听器。我写的最后一个方法总是一样的。

于 2017-08-27T21:01:34.137 回答
0

你也可以像...

   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();
    }

//标题是标记options.Title("你指定的标题");

于 2015-10-12T07:53:56.477 回答