Skip to content

Commit b25629b

Browse files
adampAndroid (Google) Code Review
authored andcommitted
Merge "Close a Spinner dropdown if its anchor view goes away." into jb-mr1-dev
2 parents 484de9d + f16daf6 commit b25629b

File tree

1 file changed

+27
-0
lines changed

1 file changed

+27
-0
lines changed

core/java/android/widget/Spinner.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,11 @@
3030
import android.view.Gravity;
3131
import android.view.View;
3232
import android.view.ViewGroup;
33+
import android.view.ViewTreeObserver;
34+
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
3335
import android.view.accessibility.AccessibilityEvent;
3436
import android.view.accessibility.AccessibilityNodeInfo;
37+
import android.widget.PopupWindow.OnDismissListener;
3538

3639

3740
/**
@@ -978,6 +981,30 @@ public void show() {
978981
super.show();
979982
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
980983
setSelection(Spinner.this.getSelectedItemPosition());
984+
985+
// Make sure we hide if our anchor goes away.
986+
// TODO: This might be appropriate to push all the way down to PopupWindow,
987+
// but it may have other side effects to investigate first. (Text editing handles, etc.)
988+
final ViewTreeObserver vto = getViewTreeObserver();
989+
if (vto != null) {
990+
final OnGlobalLayoutListener layoutListener = new OnGlobalLayoutListener() {
991+
@Override
992+
public void onGlobalLayout() {
993+
if (!Spinner.this.isVisibleToUser()) {
994+
dismiss();
995+
}
996+
}
997+
};
998+
vto.addOnGlobalLayoutListener(layoutListener);
999+
setOnDismissListener(new OnDismissListener() {
1000+
@Override public void onDismiss() {
1001+
final ViewTreeObserver vto = getViewTreeObserver();
1002+
if (vto != null) {
1003+
vto.removeOnGlobalLayoutListener(layoutListener);
1004+
}
1005+
}
1006+
});
1007+
}
9811008
}
9821009
}
9831010
}

0 commit comments

Comments
 (0)