Android,如何从 Google Map V2 中删除所有标记?

Posted

技术标签:

【中文标题】Android,如何从 Google Map V2 中删除所有标记?【英文标题】:Android, How to remove all markers from Google Map V2? 【发布时间】:2013-05-27 00:47:16 【问题描述】:

我的片段中有地图视图。我需要刷新地图并根据条件添加不同的标记。所以,我应该在添加新标记之前从地图中删除最后一个标记。

实际上,几周前应用程序运行良好,但突然发生了。我的代码是这样的:

private void displayData(final List<Venue> venueList) 

        // Removes all markers, overlays, and polylines from the map.
        googleMap.clear();
.
.
.

上次运行良好(在 android 团队在 2013 年 I/O 上宣布新的 Google Map API 之前)。然而,在那之后我调整了我的代码以使用这个新的 API。现在,我不知道为什么这种方法googleMap.clear(); 不起作用!

任何建议将不胜感激。谢谢

=======

更新

=======

完整代码:

private void displayData(final List<Venue> venueList) 

        // Removes all markers, overlays, and polylines from the map.
        googleMap.clear();

        // Zoom in, animating the camera.
        googleMap.animateCamera(CameraUpdateFactory.zoomTo(ZOOM_LEVEL), 2000, null);

        // Add marker of user's position
        MarkerOptions userIndicator = new MarkerOptions()
                .position(new LatLng(lat, lng))
                .title("You are here")
                .snippet("lat:" + lat + ", lng:" + lng);
        googleMap.addMarker(userIndicator);

        // Add marker of venue if there is any
        if(venueList != null) 
            for(int i=0; i < venueList.size(); i++) 
                Venue venue = venueList.get(i);
                String guys = venue.getMaleCount();
                String girls= venue.getFemaleCount();
                String checkinStatus = venue.getCan_checkin();
                if(checkinStatus.equalsIgnoreCase("true"))
                    checkinStatus = "Checked In - ";
                else
                    checkinStatus = "";

                MarkerOptions markerOptions = new MarkerOptions()
                        .position(new LatLng(Double.parseDouble(venue.getLatitude()), Double.parseDouble(venue.getLongitude())))
                        .title(venue.getName())
                        .snippet(checkinStatus + "Guys:" + guys + " and Girls:" + girls)
                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_orange_pin));

                googleMap.addMarker(markerOptions);
            
        

        // Move the camera instantly to where lat and lng shows.
        if(lat != 0  && lng != 0)
            googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), ZOOM_LEVEL));

        googleMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() 
            @Override
            public View getInfoWindow(Marker marker) 
                return null;
            

            @Override
            public View getInfoContents(Marker marker) 
                return null;
            
        );

        googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() 
            @Override
            public void onInfoWindowClick(Marker marker) 
                String str = marker.getId();
                Log.i(TAG, "Marker id: " + str);
                str = str.substring(1);
                int markerId = Integer.parseInt(str);
                markerId -= 1; // Because first item id of marker is 1 while list starts at 0
                Log.i(TAG, "Marker id " + markerId + " clicked.");

                // Ignore if User's marker clicked
                if(markerId < 0)
                    return;

                try 
                    Venue venue = venueList.get(markerId);
                    if(venue.getCan_checkin().equalsIgnoreCase("true")) 
                        Fragment fragment = VenueFragment.newInstance(venue);
                        if(fragment != null)
                            changeFragmentLister.OnReplaceFragment(fragment);
                        else
                            Log.e(TAG, "Error! venue shouldn't be null");
                    
                 catch(NumberFormatException e) 
                    e.printStackTrace();
                 catch(IndexOutOfBoundsException e) 
                    e.printStackTrace();
                
            
        );

【问题讨论】:

好吧,我已经尝试过了,clear() 有效。你一定是做错了什么…… 我调用了这个方法两次。第一个没有问题。第二次这条线没有清除标记并向地图添加新标记(与旧标记一起)。所以,我对正在发生的事情感到困惑。 感谢您的确认。我会尝试再次检查,也许你是对的,我做错了什么:( 【参考方案1】:

好吧,我终于找到了一种替代方法来解决我的问题。有趣的问题是,当您为地图分配标记时,它的 id 是“m0”。当您从地图中删除它并分配新标记时,您希望 id 应该是“m0”,但它是“m1”。因此,它向我表明该 id 是不可信的。所以我在片段的onActivityCreated() 的某处定义了List&lt;Marker&gt; markerList = new ArrayList&lt;Marker&gt;();

然后将上面的代码更改为以下代码。如果他们有类似的标记问题,希望它可以帮助其他人。

private void displayData(final List<Venue> venueList) 
        Marker marker;

        // Removes all markers, overlays, and polylines from the map.
        googleMap.clear();
        markerList.clear();

        // Zoom in, animating the camera.
        googleMap.animateCamera(CameraUpdateFactory.zoomTo(ZOOM_LEVEL), 2000, null);

        // Add marker of user's position
        MarkerOptions userIndicator = new MarkerOptions()
                .position(new LatLng(lat, lng))
                .title("You are here")
                .snippet("lat:" + lat + ", lng:" + lng);
        marker = googleMap.addMarker(userIndicator);
//        Log.e(TAG, "Marker id '" + marker.getId() + "' added to list.");
        markerList.add(marker);

        // Add marker of venue if there is any
        if(venueList != null) 
            for (Venue venue : venueList) 
                String guys = venue.getMaleCount();
                String girls = venue.getFemaleCount();
                String checkinStatus = venue.getCan_checkin();
                if (checkinStatus.equalsIgnoreCase("true"))
                    checkinStatus = "Checked In - ";
                else
                    checkinStatus = "";

                MarkerOptions markerOptions = new MarkerOptions()
                        .position(new LatLng(Double.parseDouble(venue.getLatitude()), Double.parseDouble(venue.getLongitude())))
                        .title(venue.getName())
                        .snippet(checkinStatus + "Guys:" + guys + " and Girls:" + girls)
                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_orange_pin));

                marker = googleMap.addMarker(markerOptions);
//                Log.e(TAG, "Marker id '" + marker.getId() + "' added to list.");
                markerList.add(marker);
            
        

        // Move the camera instantly to where lat and lng shows.
        if(lat != 0  && lng != 0)
            googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(lat, lng), ZOOM_LEVEL));

        googleMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() 
            @Override
            public View getInfoWindow(Marker marker) 
                return null;
            

            @Override
            public View getInfoContents(Marker marker) 
                return null;
            
        );

        googleMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener() 
            @Override
            public void onInfoWindowClick(Marker marker) 
                int markerId = -1;

                String str = marker.getId();
                Log.i(TAG, "Marker id: " + str);
                for(int i=0; i<markerList.size(); i++) 
                    markerId = i;
                    Marker m = markerList.get(i);
                    if(m.getId().equals(marker.getId()))
                        break;
                

                markerId -= 1; // Because first item of markerList is user's marker
                Log.i(TAG, "Marker id " + markerId + " clicked.");

                // Ignore if User's marker clicked
                if(markerId < 0)
                    return;

                try 
                    Venue venue = venueList.get(markerId);
                    if(venue.getCan_checkin().equalsIgnoreCase("true")) 
                        Fragment fragment = VenueFragment.newInstance(venue);
                        if(fragment != null)
                            changeFragmentLister.OnReplaceFragment(fragment);
                        else
                            Log.e(TAG, "Error! venue shouldn't be null");
                    
                 catch(NumberFormatException e) 
                    e.printStackTrace();
                 catch(IndexOutOfBoundsException e) 
                    e.printStackTrace();
                 catch (NullPointerException e) 
                    e.printStackTrace();
                
            
        );
    

【讨论】:

如何在不使用clear() 方法的情况下从ArrayListMarkerArray 中删除所有标记【参考方案2】:

如果您想清除“地图上的所有标记、叠加层和折线”,请在您的 GoogleMap 上使用clear()

【讨论】:

热烈欢迎亲爱的 Ahmad 加入 ***。为了防止投票失败,请在回答问题之前阅读其他答案,尤其是接受的答案。 它帮助 *** 的数据库不被重复的答案所淹没。谢谢。【参考方案3】:

使用map.clear()从谷歌地图中删除所有标记

【讨论】:

【参考方案4】:

假设有 2 个位置的 ArrayList。现在,您根据该数组在地图上显示标记。会有两个标记。当您单击第一个标记时,它会给您一个标记索引m0,第二个是m1

假设您刷新了位置数组,现在您得到了一个包含 3 个位置的数组。你有3个标记。但是当你点击第一个时,它会给你标记索引m2(好像它从第一个位置箭头继续计数)第二个是m3,第三个是m4。您真正想要的是将其设为m0m1m2

现在,当您构建位置数组时,您可能会调用location.add("you location")...,当您重建它(刷新它)时,您首先调用location.clear(),然后再次构建它。

解决方案:

首先,制作另一个类似于位置数组的虚拟数组,并在for 循环中与真实位置数组一起构建它:locaionDummy.add(i) 但你永远不要刷新它 - 那样不断建设,你会知道你从一开始就有多少个地点。

其次,使用mIndex 作为int 变量做这样的事情(设置图像的示例):

void locatePins()   

mIndex = locationDummy.size()-location.size();

for (int i = 0; i < userID.size(); i++) 

    LatLng pgLocation = new LatLng(Double.parseDouble(latArr.get(i)), Double.parseDouble(lngArr.get(i)));

    myMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter()     
        @Override
        public View getInfoWindow(Marker marker) 

        View view = getLayoutInflater().inflate(R.layout.map_marker_info, null);

        RelativeLayout markerInfo= view.findViewById(R.id.markerInfo);
        TextView name = view.findViewById(R.id.userName);
        TextView details = view.findViewById(R.id.userInfo);
        ImageView img = view.findViewById(R.id.userImg);

        name.setText(marker.getTitle());
        details.setText(marker.getSnippet());

        img.setImageBitmap (bmImg.get(Integer.parseInt(marker.getId().replaceAll("[^\\d.]", ""))-mIndex));

        return view;
    

    @Override
    public View getInfoContents(Marker marker) 

         return null;
       

    // ... the rest of the code 


关键是从locationDummy.size() 中减去真正的location.size() 得到一个数字int mIndex,您稍后将从marker.getId() 中减去该数字

【讨论】:

【参考方案5】:

如果您只需要删除标记,而将其他东西(例如地面覆盖物等)留在那里,请使用:

 marker.remove();

或者如果你有很多:

 if(markers!=null&&mMap!=null)                          
      for(int i=0;i<markers.size();i++)                
             markers.get(i).remove();
      
 

在哪里

List<Marker> markers = new ArrayList<>();

【讨论】:

以上是关于Android,如何从 Google Map V2 中删除所有标记?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 android google map v2 实现上为 geoserver 瓦片重新加载 TileOverlay

在 android 中扩展 google map api v2 的离线矢量 TileProvider

Google Map Android API V2 中两个位置之间的旅行时间

Android onLocationChanged with Direction使用Google Map Api v2

捕获 Google Map Android API V2 的屏幕截图

Google Developer 控制台“Google Map Android API V2”选项未查看启用