diff --git a/library/src/main/java/it/sephiroth/android/library/tooltip/Tooltip.java b/library/src/main/java/it/sephiroth/android/library/tooltip/Tooltip.java index d4d2c0e2..65e95919 100644 --- a/library/src/main/java/it/sephiroth/android/library/tooltip/Tooltip.java +++ b/library/src/main/java/it/sephiroth/android/library/tooltip/Tooltip.java @@ -605,7 +605,15 @@ void removeFromParent() { mPopup.dismiss(); mPopup = null; } else { - ((ViewGroup) parent).removeView(TooltipViewImpl.this); + ViewGroup parentViewGroup = (ViewGroup) parent; + + // If layout is requested we should delay removing the view to avoid parent + // onLayout crash + if (parentViewGroup.isLayoutRequested()) { + postRemoveFromParentNow(parentViewGroup); + } else { + removeFromParentNow(parentViewGroup); + } } if (null != mShowAnimation && mShowAnimation.isStarted()) { mShowAnimation.cancel(); @@ -618,6 +626,19 @@ private void removeCallbacks() { mHandler.removeCallbacks(activateRunnable); } + private void postRemoveFromParentNow(final ViewGroup parent) { + post(new Runnable() { + @Override + public void run() { + removeFromParentNow(parent); + } + }); + } + + private void removeFromParentNow(ViewGroup parent) { + parent.removeView(TooltipViewImpl.this); + } + @Override public void remove() { log(TAG, INFO, "[%d] remove()", mToolTipId);