7

The java.lang.RuntimeException is "Don't call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead," but that is not correct. I am using setOnItemClickListener to do some stuff based on the new selection, but I also need to do some stuff before the user changes the selection. Specifically, I am collecting data for each selection that needs to be saved to a file before moving to another selection, since the other selection is associated with different set of data. Is there a way to use setOnClickListener with an Android Spinner?

spinner.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        // Do some stuff before the user changes the selection
        ...

spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent,
            View view, int pos, long id) {
            // Do some stuff based onItemSelected
            ...
jacknad
  • 13,483
  • 40
  • 124
  • 194
  • 2
    A new (working) solution is available here: http://stackoverflow.com/a/8520801/406090 – OferR Dec 15 '11 at 13:32

2 Answers2

9

You can replicate the an onclick event using ontouch events

    this.spinner=(Spinner)findViewById(R.id.spinner);
    this.spinner.setClickable(false);
    this.spinner.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            Log.v(TAG, "spinner touch");

            //replicating a click
            if(event.getAction() == MotionEvent.ACTION_UP){
                v.playSoundEffect(android.view.SoundEffectConstants.CLICK);
            }
            return true;
        }
    });
dcart1234
  • 519
  • 6
  • 13
5

You will have to set the Click listener on the underlying view (normally a TextView with id: android.R.id.text1) of the spinner. To do so:

  • Create a custom Spinner
  • In the constructor (with attributes) create the spinner by supplying the layout android.R.layout.simple_spinner_item
  • Do a findViewById(android.R.id.text1) to get the TextView
  • Now set the onClickListener to the TextView
Sameer Segal
  • 21,813
  • 7
  • 42
  • 56
  • so the onclicklistener would be defined inside the custom spinner? SHould I also define an onclicklistener on the spinner itself in the activity? – Namratha Apr 16 '13 at 08:08
  • I tried the approach suggested by you-the click is registered but the dropdown still works. How do I prevent the dropdown from working since on click on the spinner I am going to another screen. – Namratha Apr 16 '13 at 08:22
  • I did that with android:clickable="false" – Namratha Apr 16 '13 at 09:05