diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/images/RNMBXImage.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/images/RNMBXImage.kt index 70bc70310..1060096c9 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/images/RNMBXImage.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/images/RNMBXImage.kt @@ -76,6 +76,17 @@ class RNMBXImage(private val mContext: ReactApplicationContext, private val mMan // region add/remove to Map fun addToMap(mapView: RNMBXMapView) { mMapView = mapView + + // The child view is usually inserted before we know the map: the child is mounted into + // this view before this view is mounted into RNMBXImages, so addView() above ran while + // mMapView was still null and the child was not placed anywhere. A view that is in no + // hierarchy is never attached to a window, and a Drawee controller only submits its + // request on attach - so an inside the child never loads, and the bitmap we + // capture shows everything except that image. Place the child now that the map is known. + val childView = mChildView + if (childView != null && childView.parent == null) { + mapView.offscreenAnnotationViewContainer?.addView(childView) + } } // endregion } \ No newline at end of file diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/images/RNMBXImages.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/images/RNMBXImages.kt index c6940963b..58e8a355c 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/images/RNMBXImages.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/images/RNMBXImages.kt @@ -177,6 +177,17 @@ class RNMBXImages(context: Context, private val mManager: RNMBXImagesManager) : return style != null && imageId?.let { style.getStyleImage(it) } != null } + /** + * Give the map to an image view that was mounted after this component was added to the map. + * + * addToMap only visits the views present at that moment, and the view manager does not pass + * the map to a later child, so such a child would never place its own child view and never + * register an image. + */ + fun attachImageViewIfOnMap(image: RNMBXImage) { + mMapView?.let { image.addToMap(it) } + } + override fun addToMap(mapView: RNMBXMapView) { super.addToMap(mapView) diff --git a/android/src/main/java/com/rnmapbox/rnmbx/components/images/RNMBXImagesManager.kt b/android/src/main/java/com/rnmapbox/rnmbx/components/images/RNMBXImagesManager.kt index 88e466646..9eb4003f7 100644 --- a/android/src/main/java/com/rnmapbox/rnmbx/components/images/RNMBXImagesManager.kt +++ b/android/src/main/java/com/rnmapbox/rnmbx/components/images/RNMBXImagesManager.kt @@ -239,6 +239,7 @@ class RNMBXImagesManager(private val mContext: ReactApplicationContext) : parent.mImageViews.add(childPosition, childView) childView.nativeImageUpdater = parent + parent.attachImageViewIfOnMap(childView) } override fun removeView(parent: RNMBXImages, view: View) {