marker.setIcon throws java.lang.IllegalArgumentException: Unmanaged descriptor

Viewed 3128

I am having trouble with changing googlemap marker on the googlemap.

Neither this method works

MarkerOptions markerOptions = new MarkerOptions().icon(BitmapDescriptorFactory.fromBitmap(MarkerManager.getBitmapFromVectorDrawable(context, R.drawable.marker_no_issues)));
                    marker.setIcon(markerOptions.getIcon());

nor this

marker.setIcon(BitmapDescriptorFactory.fromBitmap(MarkerManager.getBitmapFromVectorDrawable(context, R.drawable.marker_no_issues)));

Method getBitmapFromVectorDrawable:

public static Bitmap getBitmapFromVectorDrawable(Context context, int drawableId) {
    Drawable drawable = AppCompatDrawableManager.get().getDrawable(context, drawableId);
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
        drawable = (DrawableCompat.wrap(drawable)).mutate();
    }

    Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
            drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);

    return bitmap;
}

What i am doing wrong? Why i cant change marker icon with setIcon method. I have also tried raw .png files and i know that vector to bitmap works well.

2 Answers

As said in https://stackoverflow.com/a/42158729/2914140: "Try not to setIcon() on old marker, instead inflate new marker and then use setIcon()".

In my case I tried to replace bitmaps of selected and unselected markers when clicking on them (see https://stackoverflow.com/a/53829888/2914140). Probably the exception raised when a previous marker was invisible, as @Kaveri said above, I don't know.

Currently I get a previous marker not with a saved reference, but with setting again.

private var selectedItem: StationClusterItem? = null

override fun onMapReady(googleMap: GoogleMap) {
    ...

    val clusterRenderer = MarkerClusterRenderer(context!!, googleMap, clusterManager!!,
        unselectedBitmap!!)
    clusterManager?.setOnClusterItemClickListener { item ->
        if (selectedItem != null) {
            // Set here a reference to a previous marker.
            // We save a reference to a previous item, not to a marker.
            val lastMarker = clusterRenderer.getMarker(selectedItem)
            lastMarker?.setIcon(unselectedBitmap)
        }
        selectedItem = item
        // Now get a reference to a selected marker.
        val newMarker = clusterRenderer.getMarker(item)
        newMarker?.setIcon(selectedBitmap)
        false
    }
}
Related