Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e2238929 authored by Adam Powell's avatar Adam Powell Committed by Android Git Automerger
Browse files

am b25629b1: Merge "Close a Spinner dropdown if its anchor view goes away." into jb-mr1-dev

* commit 'b25629b1':
  Close a Spinner dropdown if its anchor view goes away.
parents e9b175b7 b25629b1
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -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);
                        }
                    }
                });
            }
        }
    }
}