【问题标题】:Multiple Markers on Map with different icons and titles地图上具有不同图标和标题的多个标记
【发布时间】:2020-04-09 16:59:26
【问题描述】:

我已经更新了我的问题,请查看它 我正在android中开发Blood Donar应用程序。我正在使用Google Map在地图上显示供体。要在地图上显示多个标记,我正在尝试此代码,但它会使应用程序崩溃

public class Profiles {
String name;
String email;
String latitude;
String longitude;
int type;

public Profiles() { }

public Profiles(String name, String email, String latitude, String longitude , int type) {
    this.name = name;
    this.email = email;
    this.latitude = latitude;
    this.longitude = longitude;
    this.type = type;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getLatitude() {
    return latitude;
}

public void setLatitude(String latitude) {
    this.latitude = latitude;
}

public String getLongitude() {
    return longitude;
}

public void setLongitude(String longitude) {
    this.longitude = longitude;
}

public int getType() {
    return type;
}

public void setType(int type) {
    this.type = type;
}

}

并且在 MapsActivity 中我得到它喜欢

 private void fun() {
            databaseReference = FirebaseDatabase.getInstance().getReference().child(Constants.content).child(Constants.profiles).child("lRSFuI5pvBZh1VZQWHI4ev52gXF2");
            databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    if (dataSnapshot.exists()) {
                        for (DataSnapshot parent : dataSnapshot.getChildren()) {
                            Profiles profiles = parent.getValue(Profiles.class);
                            name = profiles.getName();
                            String email = profiles.getEmail();
                            lat = Double.valueOf(profiles.getLatitude());
                        lon = Double.valueOf(profiles.getLongitude());
                            type = profiles.getType();

                        }
        }

     @Override
        public void onMapReady(GoogleMap googleMap) {
            mMap = googleMap;

            if (type == 1) {
                marker = new MarkerOptions().position(new LatLng(lat, lon)).title(name);
            } else {
                marker = new MarkerOptions().position(new LatLng(lat, lon)).title(name)
                        .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_bloodbank));
            }
            mMap.setOnCameraIdleListener(onCameraIdleListener);
            mMap.addMarker(marker);
        }

我收到此错误

如果我在任何其他活动中获得所有详细信息,它会为我提供一切而不会崩溃,但是当我尝试在 Maps Activity 中使用它时,它会直接导致应用程序崩溃并给出此错误。我可以理解为什么它在我获取其他详细信息时崩溃我尝试过的活动以测试并完美地融入 toast 和 logcat。

【问题讨论】:

  • 您可以简单地创建不同的标记对象并将它们添加到应用程序中。您可以自定义每个对象的图标、位置(LatLng)以及标题。
  • 我已经更新了我的问题,请您再检查一遍。
  • 错误字面上表示您用于 lat-long 的 double 值无效。

标签: android google-maps google-maps-markers google-maps-api-2


【解决方案1】:

首先,你不应该在循环中使用mMap.animateCameramMap.moveCamera。循环后,你应该设置你的相机位置并缩放到任何一个地方。

for (int i = 0; i < arrayList.size(); i++) {
    LatLng latLngForMarker = new LatLng(Double.parseDouble(arrayList.get(i).getLat()), Double.parseDouble(arrayList.get(i).getLng()));

    MarkerOptions markerOptions = new MarkerOptions().position(latLngForMarker);
    markerOptions.title(arrayList.get(i).getUserName());
    markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.my_marker_icon));
    mMap.addMarker(markerOptions.position(latLngForMarker).title(arrayList.get(i).getUserName()));
}

// Then you can set default zoom to any one location:
// default latitude and longitude for init and zoom camera, you can change by your requirement
double defaultLatitude = 23.0201818;
double defaultLongitude = 72.4396566;
CameraUpdate centerGujarat = CameraUpdateFactory.newLatLng(new LatLng(defaultLatitude, defaultLongitude));
CameraUpdate zoom = CameraUpdateFactory.zoomTo(10);
mMap.moveCamera(centerGujarat);
mMap.animateCamera(zoom);

【讨论】:

  • 我必须用drawables中的每个图标显示不同的图像,这样做不仅仅是每个项目的一张图片(markerOptions.icon(BitmapDescriptorFactory.fromResource(R.drawable.my_marker_icon)); )
  • 你应该检查内部循环并设置不同的图标。(markerOptions.icon
  • 我已经更新了我的问题,请您再检查一遍。
【解决方案2】:

根据上面的代码 sn-p,两者都是异步进程,你试图同时调用它。

当您尝试添加标记时,您应该检查isMapReady 是否也按照上述崩溃latlng 值为空,您应该等到从firebase 方法加载回调中加载数据。

理想情况下是这样的

private void fun() {
        databaseReference = FirebaseDatabase.getInstance().getReference().child(Constants.content).child(Constants.profiles).child("lRSFuI5pvBZh1VZQWHI4ev52gXF2");
        databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    for (DataSnapshot parent : dataSnapshot.getChildren()) {
                        Profiles profiles = parent.getValue(Profiles.class);
                        name = profiles.getName();
                        String email = profiles.getEmail();
                        lat = Double.valueOf(profiles.getLatitude());
                    lon = Double.valueOf(profiles.getLongitude());
                        type = profiles.getType();

                //Add your marker code here with map ready check. 

                    }
    }

【讨论】:

  • 我已经更新了我的问题,请您再检查一遍。
【解决方案3】:

经过大量努力,我找到了解决此问题的方法,但我仍然不明白它是如何工作的,因为这是正确调用函数的问题,据我说,我做得很好,但仍然有一些小的修改它 首先,我创建了一个 MarkerOptions 数组列表,并在其中添加了标记数据,我从我的 firebase 数据库中获取数据,然后在同一个函数中添加了一个 For 循环,在其中我开始添加我的标记,然后在 OnMapReady 函数中调用此函数 像这样:

private void gettingMarkersData() {

        databaseReference = FirebaseDatabase.getInstance().getReference().child(Constants.content).child(Constants.profiles);
        databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    for (DataSnapshot parent : dataSnapshot.getChildren()) {

                        Profiles profiles = parent.getValue(Profiles.class);
                        String name = profiles.getName();
                          latD = Double.valueOf(profiles.getLatitude());
                        lonD = Double.valueOf(profiles.getLongitude());
                        int type = profiles.getType();

                        if (type == 1) {
                            MarkerOptions markerOptions = new MarkerOptions().position(new LatLng(latD, lonD)).title(name);
                            marker.add(markerOptions);
                        } else if(type == 2) {
                            MarkerOptions markerOptions = new MarkerOptions().position(new LatLng(latD, lonD)).title(name)
                                    .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_bloodbank));
                            marker.add(markerOptions);
                        }

                    }
                    for (int i = 0; i < marker.size(); i++) {

                        mMap.addMarker(marker.get(i));
                    }

                }

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

然后在 OnMapReady 我调用这个函数:

public void onMapReady(GoogleMap googleMap) {

        mMap = googleMap;
        mMap.setOnCameraIdleListener(onCameraIdleListener);

        gettingMarkersData();
/* for (int i = 0; i < marker.size(); i++) {
                    mMap.addMarker(marker.get(i));
                }*/

        mMap.animateCamera(CameraUpdateFactory.zoomTo(14.0F));
        mMap.getUiSettings().setZoomControlsEnabled(true);

    }

在执行此操作之前,我在 OnMapReady(我已评论的 for 循环)中添加标记以添加标记,但它没有添加标记,然后我将其粘贴到 getMarkersData() 中。并且它开始工作正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多