有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

标记。setIcon抛出java。lang.IllegalArgumentException:非托管描述符

我在谷歌地图上更改谷歌地图标记时遇到问题

这两种方法都不起作用

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

也不是这个

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

方法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;
}

我做错了什么?为什么我不能用setIcon方法更改标记图标。 我也试过生的。png文件,我知道矢量到位图效果很好


共 (2) 个答案

  1. # 1 楼答案

    我用同样的方法解决了这个问题,如下所示- 在设置标记对象的图标之前,只需检查标记在Google地图上是否仍然可见 如果已清除地图并将图标设置为地图上的此标记对象, 将导致此错误

    在这种情况下,只需创建另一个新对象,而不是通过setter方法更新同一对象

  2. # 2 楼答案

    正如在https://stackoverflow.com/a/42158729/2914140中所说:“尽量不要setIcon()在旧的标记上,而是将新的标记充气,然后使用setIcon()

    在我的例子中,我试图在单击选定标记和未选定标记时替换它们的位图(请参见https://stackoverflow.com/a/53829888/2914140)。可能是以前的标记不可见时出现的例外,正如@Kaveri在上面所说的,我不知道

    当前,我得到的上一个标记不是保存的引用,而是再次设置的

    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
        }
    }