From f16daf61275de8bb59a0761d5dabc222ce249946 Mon Sep 17 00:00:00 2001 From: Adam Powell Date: Wed, 3 Oct 2012 11:51:34 -0700 Subject: Close a Spinner dropdown if its anchor view goes away. PopupWindow already tracks when anchor views scroll, but it doesn't catch other layout changes. Bug 7267264 Change-Id: I1e20f9335057832c78c3002aa931f533dd77514b --- core/java/android/widget/Spinner.java | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'core/java/android/widget/Spinner.java') diff --git a/core/java/android/widget/Spinner.java b/core/java/android/widget/Spinner.java index 317baf1552db..925864c9e311 100644 --- a/core/java/android/widget/Spinner.java +++ b/core/java/android/widget/Spinner.java @@ -30,8 +30,11 @@ import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; +import android.widget.PopupWindow.OnDismissListener; /** @@ -978,6 +981,30 @@ public class Spinner extends AbsSpinner implements OnClickListener { super.show(); getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); setSelection(Spinner.this.getSelectedItemPosition()); + + // Make sure we hide if our anchor goes away. + // TODO: This might be appropriate to push all the way down to PopupWindow, + // but it may have other side effects to investigate first. (Text editing handles, etc.) + final ViewTreeObserver vto = getViewTreeObserver(); + if (vto != null) { + final OnGlobalLayoutListener layoutListener = new OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + if (!Spinner.this.isVisibleToUser()) { + dismiss(); + } + } + }; + vto.addOnGlobalLayoutListener(layoutListener); + setOnDismissListener(new OnDismissListener() { + @Override public void onDismiss() { + final ViewTreeObserver vto = getViewTreeObserver(); + if (vto != null) { + vto.removeOnGlobalLayoutListener(layoutListener); + } + } + }); + } } } } -- cgit v1.2.3