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()中)。但是如果我在对话框外单击,我也不会收到通知,这也会关闭微调器
3 回答
![?](http://img1.sycdn.imooc.com/533e4d660001312002000200-100-100.jpg)
慕妹3146593
TA贡献1820条经验 获得超9个赞
观察这些事件的另一个选择是扩展Spinner
类并使用其中一个方法(performClick()
将触发其对话框/弹出窗口),然后监视持有此自定义的窗口的焦点Spinner
。这应该为您提供所有可能的完成可能性(对于对话框或下拉模式)的所需闭合事件。
自定义Spinner
类:
public class CustomSpinner extends Spinner { /** * An interface which a client of this Spinner could use to receive * open/closed events for this Spinner. */ public interface OnSpinnerEventsListener { /** * Callback triggered when the spinner was opened. */ void onSpinnerOpened(Spinner spinner); /** * Callback triggered when the spinner was closed. */ void onSpinnerClosed(Spinner spinner); } private OnSpinnerEventsListener mListener; private boolean mOpenInitiated = false; // implement the Spinner constructors that you need @Override public boolean performClick() { // register that the Spinner was opened so we have a status // indicator for when the container holding this Spinner may lose focus mOpenInitiated = true; if (mListener != null) { mListener.onSpinnerOpened(this); } return super.performClick(); } @Override public void onWindowFocusChanged (boolean hasFocus) { if (hasBeenOpened() && hasFocus) { performClosedEvent(); } } /** * Register the listener which will listen for events. */ public void setSpinnerEventsListener( OnSpinnerEventsListener onSpinnerEventsListener) { mListener = onSpinnerEventsListener; } /** * Propagate the closed Spinner event to the listener from outside if needed. */ public void performClosedEvent() { mOpenInitiated = false; if (mListener != null) { mListener.onSpinnerClosed(this); } } /** * A boolean flag indicating that the Spinner triggered an open event. * * @return true for opened Spinner */ public boolean hasBeenOpened() { return mOpenInitiated; }}
![?](http://img1.sycdn.imooc.com/533e4c9c0001975102200220-100-100.jpg)
跃然一笑
TA贡献1826条经验 获得超6个赞
基于@Luksprog精彩的解决方案,我只想添加一个小的更改,如果有人在片段中使用CustomSpinner,这将非常有用。而不是使用该Activity.onWindowFocusChanged
函数,我们重写该View.onWindowFocusChanged
函数。因此整个CustomSpinner类成为
import android.content.Context;import android.util.AttributeSet;import android.widget.Spinner;public class CustomSpinner extends Spinner { private static final String TAG = "CustomSpinner"; private OnSpinnerEventsListener mListener; private boolean mOpenInitiated = false; public CustomSpinner(Context context, AttributeSet attrs, int defStyleAttr, int mode) { super(context, attrs, defStyleAttr, mode); } public CustomSpinner(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public CustomSpinner(Context context, AttributeSet attrs) { super(context, attrs); } public CustomSpinner(Context context, int mode) { super(context, mode); } public CustomSpinner(Context context) { super(context); } public interface OnSpinnerEventsListener { void onSpinnerOpened(); void onSpinnerClosed(); } @Override public boolean performClick() { // register that the Spinner was opened so we have a status // indicator for the activity(which may lose focus for some other // reasons) mOpenInitiated = true; if (mListener != null) { mListener.onSpinnerOpened(); } return super.performClick(); } public void setSpinnerEventsListener(OnSpinnerEventsListener onSpinnerEventsListener) { mListener = onSpinnerEventsListener; } /** * Propagate the closed Spinner event to the listener from outside. */ public void performClosedEvent() { mOpenInitiated = false; if (mListener != null) { mListener.onSpinnerClosed(); } } /** * A boolean flag indicating that the Spinner triggered an open event. * * @return true for opened Spinner */ public boolean hasBeenOpened() { return mOpenInitiated; } @Override public void onWindowFocusChanged(boolean hasWindowFocus) { android.util.Log.d(TAG, "onWindowFocusChanged"); super.onWindowFocusChanged(hasWindowFocus); if (hasBeenOpened() && hasWindowFocus) { android.util.Log.i(TAG, "closing popup"); performClosedEvent(); } }}
- 3 回答
- 0 关注
- 428 浏览
添加回答
举报
0/150
提交
取消