diff options
Diffstat (limited to 'core/java')
| -rw-r--r-- | core/java/android/widget/PopupWindow.java | 44 |
1 files changed, 30 insertions, 14 deletions
diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java index 989927e0c22d..db876f6f0cbf 100644 --- a/core/java/android/widget/PopupWindow.java +++ b/core/java/android/widget/PopupWindow.java @@ -208,6 +208,21 @@ public class PopupWindow { com.android.internal.R.attr.state_above_anchor }; + private final OnAttachStateChangeListener mOnAnchorDetachedListener = + new OnAttachStateChangeListener() { + @Override + public void onViewAttachedToWindow(View v) { + // Anchor might have been reattached in a different position. + alignToAnchor(); + } + + @Override + public void onViewDetachedFromWindow(View v) { + // Leave the popup in its current position. + // The anchor might become attached again. + } + }; + private final OnAttachStateChangeListener mOnAnchorRootDetachedListener = new OnAttachStateChangeListener() { @Override @@ -223,20 +238,7 @@ public class PopupWindow { private WeakReference<View> mAnchorRoot; private boolean mIsAnchorRootAttached; - private final OnScrollChangedListener mOnScrollChangedListener = new OnScrollChangedListener() { - @Override - public void onScrollChanged() { - final View anchor = mAnchor != null ? mAnchor.get() : null; - if (anchor != null && mDecorView != null) { - final WindowManager.LayoutParams p = (WindowManager.LayoutParams) - mDecorView.getLayoutParams(); - - updateAboveAnchor(findDropDownPosition(anchor, p, mAnchorXoff, mAnchorYoff, - p.width, p.height, mAnchoredGravity, false)); - update(p.x, p.y, -1, -1, true); - } - } - }; + private final OnScrollChangedListener mOnScrollChangedListener = this::alignToAnchor; private int mAnchorXoff; private int mAnchorYoff; @@ -2214,6 +2216,7 @@ public class PopupWindow { if (anchor != null) { final ViewTreeObserver vto = anchor.getViewTreeObserver(); vto.removeOnScrollChangedListener(mOnScrollChangedListener); + anchor.removeOnAttachStateChangeListener(mOnAnchorDetachedListener); } final View anchorRoot = mAnchorRoot != null ? mAnchorRoot.get() : null; @@ -2233,6 +2236,7 @@ public class PopupWindow { if (vto != null) { vto.addOnScrollChangedListener(mOnScrollChangedListener); } + anchor.addOnAttachStateChangeListener(mOnAnchorDetachedListener); final View anchorRoot = anchor.getRootView(); anchorRoot.addOnAttachStateChangeListener(mOnAnchorRootDetachedListener); @@ -2247,6 +2251,18 @@ public class PopupWindow { mAnchoredGravity = gravity; } + private void alignToAnchor() { + final View anchor = mAnchor != null ? mAnchor.get() : null; + if (anchor != null && anchor.isAttachedToWindow() && mDecorView != null) { + final WindowManager.LayoutParams p = (WindowManager.LayoutParams) + mDecorView.getLayoutParams(); + + updateAboveAnchor(findDropDownPosition(anchor, p, mAnchorXoff, mAnchorYoff, + p.width, p.height, mAnchoredGravity, false)); + update(p.x, p.y, -1, -1, true); + } + } + private class PopupDecorView extends FrameLayout { private TransitionListenerAdapter mPendingExitListener; |
