Google maps getTag () всегда имеет значение null, хотя setTag () не - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь добавить тег через marker.setTag (объект объекта) в методе addMarkers ниже. Я отладил, чтобы убедиться, что в значении, установленном в теге, нет нуля. Однако, когда я пытаюсь получить данные тега с помощью getTag (), я получаю нулевое значение и не понимаю, почему и что я делаю не так.

private void addMarkers() {
        resetMap();
        CollectionReference restaurantCollection = FirebaseFirestore.getInstance().collection("Restaurant_Data");
        restaurantCollection.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
            @Override
            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
                    GeoPoint restaurantPoints = documentSnapshot.getGeoPoint("geoPoint");
                    String restaurantName = documentSnapshot.getString("restaurantName");
                    String snippet = documentSnapshot.getString("restaurantDescription");
                    double lat = restaurantPoints.getLatitude();
                    double lng = restaurantPoints.getLongitude();
                    LatLng latLng = new LatLng(lat, lng);

                    if (googleMap != null) {
                        MarkerOptions markerOptions = new MarkerOptions().position(latLng).title(restaurantName).icon(BitmapDescriptorFactory.defaultMarker(162)).snippet(snippet);
                        googleMap.addMarker(markerOptions);
                        Marker marker = googleMap.addMarker(markerOptions);
                        RestaurantMarker restaurantMarker = new RestaurantMarker(documentSnapshot.getId(), marker);
                        markerRestaurantIdArrayList.add(restaurantMarker);
                        marker.setTag(restaurantMarker);
                    }
                }
            }
        });
    }

Это метод, в котором я получаю тег. Я знаю, что маркер не только не нулевой, но и правильный, так как я получаю правильное значение на карте, а также заголовок и фрагмент:

@Override
    public void onInfoWindowClick(final Marker marker) {
        final AlertDialog.Builder builder = new AlertDialog.Builder(mapviewContext);
        builder.setMessage(marker.getSnippet()).setCancelable(true).setPositiveButton("See Menu", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                RestaurantMarker restaurantMarker = (RestaurantMarker)marker.getTag();
                if (restaurantMarker != null && marker.getTag() instanceof RestaurantMarker) {
                    Log.d(TAG, "restaurant ID:"+ restaurantMarker.getRestaurantId());
                    bundle.putString("restaurantId", restaurantMarker.getRestaurantId());
                    bundle.putString("restaurantName", marker.getTitle());
                    bundle.putBoolean("direction", true);
                    restaurantMapListener.onRestaurantMap(bundle);
                } else {
                    Log.d(TAG, "restaurant marker is null");
                }
                dialogInterface.cancel();
            }
        }).setNegativeButton("Calculate Distance", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                resetSelectedMarker();
                selectedMarker = marker;
                calculateDirections(marker);
                dialogInterface.dismiss();
                markerRestaurantName = marker.getTitle();
            }
        });
        final AlertDialog alert = builder.create();
        alert.show();
    }

И, наконец, вот ресторанчик POJO. Здесь тоже нет проблем, потому что я использую его в другом месте и без проблем:

public class RestaurantMarker {
    public String restaurantId;
    public Marker restaurantMarker;

    public RestaurantMarker(String restaurantId, Marker restaurantMarker) {
        this.restaurantId = restaurantId;
        this.restaurantMarker = restaurantMarker;
    }

    public String getRestaurantId() {
        return restaurantId;
    }

    public void setRestaurantId(String restaurantId) {
        this.restaurantId = restaurantId;
    }

    public Marker getRestaurantMarker() {
        return restaurantMarker;
    }

    public void setRestaurantMarker(Marker restaurantMarker) {
        this.restaurantMarker = restaurantMarker;
    }
}

1 Ответ

0 голосов
/ 26 июня 2019

Из вашего кода addMarkers():

...
MarkerOptions markerOptions = new MarkerOptions().position(latLng).title(restaurantName).icon(BitmapDescriptorFactory.defaultMarker(162)).snippet(snippet);
googleMap.addMarker(markerOptions);
Marker marker = googleMap.addMarker(markerOptions);
RestaurantMarker restaurantMarker = new RestaurantMarker(documentSnapshot.getId(), marker);
markerRestaurantIdArrayList.add(restaurantMarker);
marker.setTag(restaurantMarker);
...

вы добавляете маркер в googleMap дважды (в той же позиции LatLng): один раз в строке googleMap.addMarker(markerOptions);, затем в строке Marker marker = googleMap.addMarker(markerOptions);, но устанавливаете тег только для маркера "добавлено второй раз". Вероятно, когда вы пытаетесь получить данные тега с помощью getTag() для маркера, на который нажали кнопку, он вызвал маркер «добавлено впервые» без установленного тега (поскольку оба маркера имеют одинаковые координаты LatLng). Итак, попробуйте удалить googleMap.addMarker(markerOptions); строку из addMarkers() метода:

...
MarkerOptions markerOptions = new MarkerOptions().position(latLng).title(restaurantName).icon(BitmapDescriptorFactory.defaultMarker(162)).snippet(snippet);
//googleMap.addMarker(markerOptions);  <-- delete this line
Marker marker = googleMap.addMarker(markerOptions);
RestaurantMarker restaurantMarker = new RestaurantMarker(documentSnapshot.getId(), marker);
markerRestaurantIdArrayList.add(restaurantMarker);
marker.setTag(restaurantMarker);
...
...