Spinner: get state or get notified when opens
Another option to watch for those events is to extend the Spinner
class and use one of its methods(performClick()
which will trigger its dialog/popup) followed by monitoring the focus of the window holding this custom Spinner
. This should provide you with the wanted closed event for all the possible finishing possibilities(for either the dialog or dropdown mode).
The custom Spinner
class:
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;
}
}
How to detect if the Spinner is click open on Android
You can set Touch-listener on Spinner to detect click.
findViewById(R.id.spinner).setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Toast.makeText(MainActivity.this,"CallAPI",Toast.LENGTH_SHORT).show();
return false;
}
});
And return False from onTouch to behave normally.I hope It will work for you.
Android Spinner: Get the selected item change event
Some of the previous answers are not correct. They work for other widgets and views, but the documentation for the Spinner widget clearly states:
A spinner does not support item click
events. Calling this method will raise
an exception.
Better use OnItemSelectedListener() instead:
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
// your code here
}
@Override
public void onNothingSelected(AdapterView<?> parentView) {
// your code here
}
});
This works for me.
Note that onItemSelected method is also invoked when the view is being build, so you can consider putting it inside onCreate()
method call.
Related Topics
Tabwidget Current Tab Bottom Line Color
Passing Arraylist Through Intent
How to Change Default Dialog Button Text Color in Android 5
Android Canvas: Drawing Too Large Bitmap
How to Implement Drawerarrowtoggle from Android Appcompat V7 21 Library
How to Hide Soft Keyboard When Activity Starts
Viewpager with Previous and Next Page Boundaries
Execute Asynctask Several Times
How to Enable/Disable Bluetooth Programmatically in Android
Dynamically Changing the Fragments Inside a Fragment Tab Host
Android Fragment Onattach() Deprecated
Changing Screen Brightness Programmatically (As with the Power Widget)
How to Provide Shadow to Button
Going to Home Screen Programmatically
How to Make a Dotted/Dashed Line in Android
Android - How to Receive Broadcast Intents Action_Screen_On/Off
Android Fragments. Retaining an Asynctask During Screen Rotation or Configuration Change