猿问

Spinner:获取状态或在打开时收到通知

Spinner:获取状态或在打开时收到通知

是否可以知道a Spinner是开放还是关闭?如果有一些onOpenListener for Spinners会更好。

我试过像这样使用OnItemSelectedListener:

spinnerType.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            executeSomething();

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            Log.d("nothing" , "selected");  
        }

    });

我知道如果选择了某些东西,窗口将会关闭(在executeSomething()中)。但是如果我在对话框外单击,我也不会收到通知,这也会关闭微调器


婷婷同学_
浏览 429回答 3
3回答

慕妹3146593

观察这些事件的另一个选择是扩展Spinner类并使用其中一个方法(performClick()将触发其对话框/弹出窗口),然后监视持有此自定义的窗口的焦点Spinner。这应该为您提供所有可能的完成可能性(对于对话框或下拉模式)的所需闭合事件。自定义Spinner类:public&nbsp;class&nbsp;CustomSpinner&nbsp;extends&nbsp;Spinner&nbsp;{ &nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;An&nbsp;interface&nbsp;which&nbsp;a&nbsp;client&nbsp;of&nbsp;this&nbsp;Spinner&nbsp;could&nbsp;use&nbsp;to&nbsp;receive &nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;open/closed&nbsp;events&nbsp;for&nbsp;this&nbsp;Spinner.&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;interface&nbsp;OnSpinnerEventsListener&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Callback&nbsp;triggered&nbsp;when&nbsp;the&nbsp;spinner&nbsp;was&nbsp;opened. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;onSpinnerOpened(Spinner&nbsp;spinner); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Callback&nbsp;triggered&nbsp;when&nbsp;the&nbsp;spinner&nbsp;was&nbsp;closed. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;onSpinnerClosed(Spinner&nbsp;spinner); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;OnSpinnerEventsListener&nbsp;mListener; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;mOpenInitiated&nbsp;=&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;implement&nbsp;the&nbsp;Spinner&nbsp;constructors&nbsp;that&nbsp;you&nbsp;need &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;performClick()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;register&nbsp;that&nbsp;the&nbsp;Spinner&nbsp;was&nbsp;opened&nbsp;so&nbsp;we&nbsp;have&nbsp;a&nbsp;status &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;indicator&nbsp;for&nbsp;when&nbsp;the&nbsp;container&nbsp;holding&nbsp;this&nbsp;Spinner&nbsp;may&nbsp;lose&nbsp;focus &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mOpenInitiated&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(mListener&nbsp;!=&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mListener.onSpinnerOpened(this); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;super.performClick(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onWindowFocusChanged&nbsp;(boolean&nbsp;hasFocus)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hasBeenOpened()&nbsp;&&&nbsp;hasFocus)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;performClosedEvent(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Register&nbsp;the&nbsp;listener&nbsp;which&nbsp;will&nbsp;listen&nbsp;for&nbsp;events. &nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setSpinnerEventsListener( &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnSpinnerEventsListener&nbsp;onSpinnerEventsListener)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mListener&nbsp;=&nbsp;onSpinnerEventsListener; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Propagate&nbsp;the&nbsp;closed&nbsp;Spinner&nbsp;event&nbsp;to&nbsp;the&nbsp;listener&nbsp;from&nbsp;outside&nbsp;if&nbsp;needed. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;performClosedEvent()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mOpenInitiated&nbsp;=&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(mListener&nbsp;!=&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mListener.onSpinnerClosed(this); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;A&nbsp;boolean&nbsp;flag&nbsp;indicating&nbsp;that&nbsp;the&nbsp;Spinner&nbsp;triggered&nbsp;an&nbsp;open&nbsp;event. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;true&nbsp;for&nbsp;opened&nbsp;Spinner&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;hasBeenOpened()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;mOpenInitiated; &nbsp;&nbsp;&nbsp;&nbsp;}}

跃然一笑

基于@Luksprog精彩的解决方案,我只想添加一个小的更改,如果有人在片段中使用CustomSpinner,这将非常有用。而不是使用该Activity.onWindowFocusChanged函数,我们重写该View.onWindowFocusChanged函数。因此整个CustomSpinner类成为import&nbsp;android.content.Context;import&nbsp;android.util.AttributeSet;import&nbsp;android.widget.Spinner;public&nbsp;class&nbsp;CustomSpinner&nbsp;extends&nbsp;Spinner&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;static&nbsp;final&nbsp;String&nbsp;TAG&nbsp;=&nbsp;"CustomSpinner"; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;OnSpinnerEventsListener&nbsp;mListener; &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;boolean&nbsp;mOpenInitiated&nbsp;=&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;CustomSpinner(Context&nbsp;context,&nbsp;AttributeSet&nbsp;attrs,&nbsp;int&nbsp;defStyleAttr,&nbsp;int&nbsp;mode)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(context,&nbsp;attrs,&nbsp;defStyleAttr,&nbsp;mode); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;CustomSpinner(Context&nbsp;context,&nbsp;AttributeSet&nbsp;attrs,&nbsp;int&nbsp;defStyleAttr)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(context,&nbsp;attrs,&nbsp;defStyleAttr); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;CustomSpinner(Context&nbsp;context,&nbsp;AttributeSet&nbsp;attrs)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(context,&nbsp;attrs); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;CustomSpinner(Context&nbsp;context,&nbsp;int&nbsp;mode)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(context,&nbsp;mode); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;CustomSpinner(Context&nbsp;context)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(context); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;interface&nbsp;OnSpinnerEventsListener&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;onSpinnerOpened(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;onSpinnerClosed(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;performClick()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;register&nbsp;that&nbsp;the&nbsp;Spinner&nbsp;was&nbsp;opened&nbsp;so&nbsp;we&nbsp;have&nbsp;a&nbsp;status &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;indicator&nbsp;for&nbsp;the&nbsp;activity(which&nbsp;may&nbsp;lose&nbsp;focus&nbsp;for&nbsp;some&nbsp;other &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;reasons) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mOpenInitiated&nbsp;=&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(mListener&nbsp;!=&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mListener.onSpinnerOpened(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;super.performClick(); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;setSpinnerEventsListener(OnSpinnerEventsListener&nbsp;onSpinnerEventsListener)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mListener&nbsp;=&nbsp;onSpinnerEventsListener; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Propagate&nbsp;the&nbsp;closed&nbsp;Spinner&nbsp;event&nbsp;to&nbsp;the&nbsp;listener&nbsp;from&nbsp;outside. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;performClosedEvent()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mOpenInitiated&nbsp;=&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(mListener&nbsp;!=&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mListener.onSpinnerClosed(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;A&nbsp;boolean&nbsp;flag&nbsp;indicating&nbsp;that&nbsp;the&nbsp;Spinner&nbsp;triggered&nbsp;an&nbsp;open&nbsp;event. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;true&nbsp;for&nbsp;opened&nbsp;Spinner &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;boolean&nbsp;hasBeenOpened()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;mOpenInitiated; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;onWindowFocusChanged(boolean&nbsp;hasWindowFocus)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android.util.Log.d(TAG,&nbsp;"onWindowFocusChanged"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.onWindowFocusChanged(hasWindowFocus); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(hasBeenOpened()&nbsp;&&&nbsp;hasWindowFocus)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;android.util.Log.i(TAG,&nbsp;"closing&nbsp;popup"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;performClosedEvent(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;}}
随时随地看视频慕课网APP

相关分类

Android
我要回答