Android的,如何从谷歌地图V2的所有标记?标记、地图、Android

2023-09-06 00:41:37 作者:爱洗澡的魚

我有我的片段映射视图。我需要刷新地图,添加基于条件不同的标记。所以,我应该删除过去的标志,从图前增加新的标记。

其实,几个星期前的应用程序工作正常,突然发生的。我的code是这样的:

 私人无效displayData(最终名单,其中,地点及GT; venueList){

        //删除所有标记,覆盖,并从地图折线。
        googleMap.clear();
。
。
。
}
 

最后一次是工作的罚款(新的谷歌地图API之前,在I / O 2013宣布由Android团队)。不过,在那之后我适应我的code使用这个新的API。现在,我不知道为什么这种方法 googleMap.clear(); 不工作!

任何建议将AP preciated。谢谢

=======

更新

=======

完成code:

 私人无效displayData(最终名单,其中,地点及GT; venueList){

        //删除所有标记,覆盖,并从地图折线。
        googleMap.clear();

        //放大,相机动画。
        googleMap.animateCamera(CameraUpdateFactory.zoomTo(ZOOM_LEVEL),2000,NULL);

        //将用户的位置标记
        MarkerOptions userIndicator =新MarkerOptions()
                .position(新经纬度(纬度,经度))
                .title伪(你在这里)
                是.snippet(纬度:+纬度+,LNG:+ LNG);
        googleMap.addMarker(userIndicator);

        //添加会场标记,如果有任何
        如果(venueList!= NULL){
            的for(int i = 0; I< venueList.size();我++){
                场馆场地= venueList.get(我);
                字符串家伙= venue.getMaleCount();
                字符串女生= venue.getFemaleCount();
                串checkinStatus = venue.getCan_checkin();
                如果(checkinStatus.equalsIgnoreCase(真))
                    checkinStatus =签入 - ;
                其他
                    checkinStatus =;

                MarkerOptions markerOptions =新MarkerOptions()
                        .position(新经纬度(Double.parseDouble(venue.getLatitude()),Double.parseDouble(venue.getLongitude())))
                        .title伪(venue.getName())
                        是.snippet(checkinStatus +伙计们:+人+和女孩:+女孩)
                        .icon(BitmapDesc​​riptorFactory.fromResource(R.drawable.ic_orange_pin));

                googleMap.addMarker(markerOptions);
            }
        }

        //瞬间移动相机到纬度和经度节目。
        如果(纬度= 0&放大器;!&安培;!LNG = 0)
            googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(新经纬度(纬度,经度),ZOOM_LEVEL));

        googleMap.setInfoWindowAdapter(新GoogleMap.InfoWindowAdapter(){
            @覆盖
            公共查看getInfoWindow(标记标记){
                返回null;
            }

            @覆盖
            公共查看getInfoContents(标记标记){
                返回null;
            }
        });

        googleMap.setOnInfoWindowClickListener(新GoogleMap.OnInfoWindowClickListener(){
            @覆盖
            公共无效onInfoWindowClick(标记标记){
                字符串str = marker.getId();
                Log.i(TAG,标记ID:+ STR);
                海峡= str.substring(1);
                INT markerId =的Integer.parseInt(STR);
                markerId  -  = 1; //因为标记的第一项ID为1,而列表从0开始
                Log.i(TAG标记ID+ markerId +点击);

                //忽略,如果用户点击标记
                如果(markerId℃,)
                    返回;

                尝试 {
                    场馆场地= venueList.get(markerId);
                    如果(venue.getCan_checkin()。equalsIgnoreCase(真)){
                        片段片段= VenueFragment.newInstance(场地);
                        如果(片段!= NULL)
                            changeFragmentLister.OnReplaceFragment(片段);
                        其他
                            Log.e(TAG,错误!场地不能为空);
                    }
                }赶上(NumberFormatException异常E){
                    e.printStackTrace();
                }赶上(IndexOutOfBoundsException异常E){
                    e.printStackTrace();
                }
            }
        });
 

解决方案

好了终于让我找到一个替代的方式来解决我的问题。有趣的问题是,当你分配一个标记映射,它的ID是M0。当您从地图中移除,并指定新的标记你所期望的ID应该是'M0',但它的M1。因此,它给我的ID是不值得信赖的。所以我定义的名单,其中,标记> markerList =新的ArrayList<标记>(); 介于 onActivityCreated()我片段

然后上面code改变与下列之一。希望它可以帮助其他人,如果他们有标记类似的问题。

 私人无效displayData(最终名单,其中,地点及GT; venueList){
        标记标记;

        //删除所有标记,覆盖,并从地图折线。
        googleMap.clear();
        markerList.clear();

        //放大,相机动画。
        googleMap.animateCamera(CameraUpdateFactory.zoomTo(ZOOM_LEVEL),2000,NULL);

        //将用户的位置标记
        MarkerOptions userIndicator =新MarkerOptions()
                .position(新经纬度(纬度,经度))
                .title伪(你在这里)
                是.snippet(纬度:+纬度+,LNG:+ LNG);
        标记= googleMap.addMarker(userIndicator);
// Log.e(TAG,标记ID+ marker.getId()+'添加到列表中。);
        markerList.add(标记);

        //添加会场标记,如果有任何
        如果(venueList!= NULL){
            对于(会场地点:venueList){
                字符串家伙= venue.getMaleCount();
                字符串女生= venue.getFemaleCount();
                串checkinStatus = venue.getCan_checkin();
                如果(checkinStatus.equalsIgnoreCase(真))
                    checkinStatus =签入 - ;
                其他
                    checkinStatus =;

                MarkerOptions markerOptions =新MarkerOptions()
                        .position(新经纬度(Double.parseDouble(venue.getLatitude()),Double.parseDouble(venue.getLongitude())))
                        .title伪(venue.getName())
                        是.snippet(checkinStatus +伙计们:+人+和女孩:+女孩)
                        .icon(BitmapDesc​​riptorFactory.fromResource(R.drawable.ic_orange_pin));

                标记= googleMap.addMarker(markerOptions);
// Log.e(TAG,标记ID+ marker.getId()+'添加到列表中。);
                markerList.add(标记);
            }
        }

        //瞬间移动相机到纬度和经度节目。
        如果(纬度= 0&放大器;!&安培;!LNG = 0)
            googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(新经纬度(纬度,经度),ZOOM_LEVEL));

        googleMap.setInfoWindowAdapter(新GoogleMap.InfoWindowAdapter(){
            @覆盖
            公共查看getInfoWindow(标记标记){
                返回null;
            }

            @覆盖
            公共查看getInfoContents(标记标记){
                返回null;
            }
        });

        googleMap.setOnInfoWindowClickListener(新GoogleMap.OnInfoWindowClickListener(){
            @覆盖
            公共无效onInfoWindowClick(标记标记){
                INT markerId = -1;

                字符串str = marker.getId();
                Log.i(TAG,标记ID:+ STR);
                的for(int i = 0; I< markerList.size();我++){
                    markerId =我;
                    标记米= markerList.get(ⅰ);
                    如果(m.getId()。等于(marker.getId()))
                        打破;
                }

                markerId  -  = 1; //因为首先markerList的产品用户的标记
                Log.i(TAG标记ID+ markerId +点击);

                //忽略,如果用户点击标记
                如果(markerId℃,)
                    返回;

                尝试 {
                    场馆场地= venueList.get(markerId);
                    如果(venue.getCan_checkin()。equalsIgnoreCase(真)){
                        片段片段= VenueFragment.newInstance(场地);
                        如果(片段!= NULL)
                            changeFragmentLister.OnReplaceFragment(片段);
                        其他
                            Log.e(TAG,错误!场地不能为空);
                    }
                }赶上(NumberFormatException异常E){
                    e.printStackTrace();
                }赶上(IndexOutOfBoundsException异常E){
                    e.printStackTrace();
                }赶上(NullPointerException异常E){
                    e.printStackTrace();
                }
            }
        });
    }
 
谷歌地图界面将重新设计 在I O开发大会上推出

I have map view in my fragment. I need to refresh map and add different markers based on condition. So, I should remove last markers from map before add new markers.

Actually, some weeks ago app was working fine and suddenly it happened. My code is like this:

private void displayData(final List<Venue> venueList) {

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

Last time it was working fine (before new Google Map API announce by Android team in I/O 2013). However, after that I adapted my code to use this new API. Now, I don't know why this method googleMap.clear(); doesn't work!

Any suggestion would be appreciated. Thanks

=======

Update

=======

Complete code:

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

解决方案

Okay finally I found a replacement way to solve my problem. The interesting problem is when you assign a marker to map, it's id is 'm0'. When you remove it from map and assign new marker you expect the id should be 'm0' but it's 'm1'. Therefore, it showed me the id is not trustable. So I defined List<Marker> markerList = new ArrayList<Marker>(); somewhere in onActivityCreated() of my fragment.

Then changed above code with following one. hope it helps others if they have similar issue with markers.

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