Reputation: 2486
I try to attach a on select event to my Android android.widget.Spinner
I know Spinner.setOnItemSelectedListener
exist but not work as I want,
The problem with the setOnItemSelectedListener
is that method is call while the spinner is load with a Adapter and as predefine a item is select.
I want a interface for get a event while a "user" select a item from the Spinner by use the tuch screen. Also a event that only is call while the use select a item and not the program select a item.
I want a event that is call while the use select a item from this spinner dialog.
Upvotes: 2
Views: 3187
Reputation: 10125
As mentioned in this matter the onClick()
does not work starting but recent versions of android (I tested it on some versions from 4.0).
So I adapted the answer for this FIG-GHD742 who works in newer versions of android (tested on 4.1 and 4.3):
public class SelectSpinner extends Spinner {
public interface OnSelectSpinnerListener {
public void onOpenSelectMenu();
public void onItemSelectByUser(AdapterView<?> parent, View view,
int position, long id);
}
private boolean isUserOpen = false;
private List<OnSelectSpinnerListener> onSelectSpinnerListeners;
private OnItemSelectedListener onItemSelectedListener;
public SelectSpinner(Context context) {
super(context);
registerEvents();
}
public SelectSpinner(Context context, AttributeSet attrs) {
super(context, attrs);
registerEvents();
}
public SelectSpinner(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
registerEvents();
}
/**
* Register default events
* */
private void registerEvents() {
// overrides the default event for android OnItemSelectedListener
super.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
if (onItemSelectedListener != null) {
// call onItemSelected default event in android
onItemSelectedListener.onItemSelected(parent, view,
position, id);
}
// checks if the spinner selection is opened by the user and has event listener
if (isUserOpen && onSelectSpinnerListeners != null) {
for (OnSelectSpinnerListener listener : onSelectSpinnerListeners) {
listener.onItemSelectByUser(parent, view, position, id);
}
isUserOpen = false;
}
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
if (onItemSelectedListener != null) {
// call onNothingSelected default event in android
onItemSelectedListener.onNothingSelected(parent);
}
}
});
}
public void addOnSelectSpinnerListener(
OnSelectSpinnerListener onSelectSpinnerListener) {
if (this.onSelectSpinnerListeners == null) {
this.onSelectSpinnerListeners = new ArrayList<SelectSpinner.OnSelectSpinnerListener>();
}
this.onSelectSpinnerListeners.add(onSelectSpinnerListener);
}
@Override
public void setOnItemSelectedListener(OnItemSelectedListener listener) {
this.onItemSelectedListener = listener;
}
@Override
public boolean performClick() {
// isUserOpen variable set to true, to indicate that there was user interaction
isUserOpen = true;
if (this.onSelectSpinnerListeners != null) {
for (OnSelectSpinnerListener listener : this.onSelectSpinnerListeners) {
// call onOpenSelectMenu event
listener.onOpenSelectMenu();
}
}
return super.performClick();
}
}
Upvotes: 4
Reputation: 2486
I have finally find a solution that works for me, by look at the code on http://www.oschina.net/code/explore/android-4.0.1/core/java/android/widget/Spinner.java
I found out how to prevent or attach more code to this code part that is run while the use will show the dropdown list and then create my one instace of Spinner.
My spinner class has a use define interface OnSelectSpinnerListener
that will be run while the user tuch the spinner and then select a item from the spinner list.
/**
* Create a DropDown Spinner/Select List, that also has some event for detect
* action do by the use and action do by the system.
*
* Use {@link OnSelectSpinnerListener} for attach a listener to this
* SelectSpinner.
*/
public class SelectSpinner extends Spinner {
public interface OnSelectSpinnerListener {
/**
* Call before the drop down menu is show that allow use to select one
* of the item from the Spinner.
*/
public void onOpenSelectMenu();
/**
* Call while the use press a button or item for select this. This will
* not be call while the system set a select value for the spinner. Use {@link SelectSpinner#setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener)}
* for get all event while a item is set to the spinner.
*
* @param index Select item as Index
* @param object Select item as Object
*/
public void onItemSelectByUser(int index, Object object);
}
private OnSelectSpinnerListener onSelectSpinnerListener;
public SelectSpinner(Context context) {
super(context);
}
public SelectSpinner(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SelectSpinner(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public OnSelectSpinnerListener getOnSelectSpinnerListener() {
return onSelectSpinnerListener;
}
public void setOnSelectSpinnerListener(OnSelectSpinnerListener onSelectSpinnerListener) {
this.onSelectSpinnerListener = onSelectSpinnerListener;
}
@Override
public void onClick(DialogInterface dialog, int which) {
super.onClick(dialog, which);
if (this.onSelectSpinnerListener != null) {
Object item = super.getItemAtPosition(which);
this.onSelectSpinnerListener.onItemSelectByUser(which, item);
}
}
@Override
public boolean performClick() {
if (this.onSelectSpinnerListener != null) {
this.onSelectSpinnerListener.onOpenSelectMenu();
}
return super.performClick();
}
}
Upvotes: 3
Reputation: 6728
spinner.setOnItemSelectedListener(this)
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
//here arg2 will return the number of option which user select
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
switch (arg2) {
case 0:
// do something for london
Toast.makeText(getApplicationContext(), "London",Toast.LENGTH_SHORT).show();
break;
case 1:
// do something for Paris
Toast.makeText(getApplicationContext(), "Paris",Toast.LENGTH_SHORT).show();
break;
case 2:
// do something for Stockholm
Toast.makeText(getApplicationContext(), "Stockholm",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub enter code here
}
Upvotes: 0