views:

1184

answers:

1

I have an Android Spinner and I'd like to get a callback when the user selects something from its popup dialog. It seems like setOnItemClickListener() or setOnItemSelectedListener() would be the right method to use, but neither get invoked when I select one of the items in the spinner.

Is there a correct way to do this?

UPDATE

Per commonsware's suggestion, I did the following, but my onItemSelected() method is never being called:

    final Spinner spinner = (Spinner) findViewById(R.id.spinner);

    spinner.setAdapter( new ArrayAdapter<SettingValue>(getContext(), android.R.layout.simple_list_item_1, android.R.id.text1, setting.getSettingValues() ) );
    spinner.setOnItemSelectedListener( new OnItemSelectedListener() {

        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            Log.d("BOOGA");
            final SettingValue settingValue = (SettingValue)parent.getSelectedItem();
            final Editor edit = getContext().getSharedPreferences( PREFS_CONTEXT_NAME, Context.MODE_PRIVATE).edit();
            edit.putString(setting.name(), settingValue.name());
            edit.commit();
        }

        public void onNothingSelected(AdapterView<?> parent) {
            // do nothing
        }

    });
+2  A: 

Use setOnItemSelectedListener(). Here is one of my book examples:

/***
    Copyright (c) 2008-2009 CommonsWare, LLC

    Licensed under the Apache License, Version 2.0 (the "License"); you may
    not use this file except in compliance with the License. You may obtain
    a copy of the License at
     http://www.apache.org/licenses/LICENSE-2.0
    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
*/

package com.commonsware.android.selection;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;

public class SpinnerDemo extends Activity
    implements AdapterView.OnItemSelectedListener {
    TextView selection;
    String[] items={"lorem", "ipsum", "dolor", "sit", "amet",
        "consectetuer", "adipiscing", "elit", "morbi", "vel",
        "ligula", "vitae", "arcu", "aliquet", "mollis",
        "etiam", "vel", "erat", "placerat", "ante",
        "porttitor", "sodales", "pellentesque", "augue", "purus"};

    @Override
    public void onCreate(Bundle icicle) {
     super.onCreate(icicle);
     setContentView(R.layout.main);
     selection=(TextView)findViewById(R.id.selection);

     Spinner spin=(Spinner)findViewById(R.id.spinner);
     spin.setOnItemSelectedListener(this);

     ArrayAdapter<String> aa=new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, items);

     aa.setDropDownViewResource(
      android.R.layout.simple_spinner_dropdown_item);
     spin.setAdapter(aa);
    }

    public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
     selection.setText(items[position]);
    }

    public void onNothingSelected(AdapterView<?> parent) {
     selection.setText("");
    }
}
CommonsWare
Thanks for that code, commonsware. I tried it out and it's not working for me. The `onItemSelected()` listener is never getting called for some reason. See my update above. Any ideas?
Mike
You aren't using my code at all. If you compare the two, you will see that you are not using a Spinner resource in the second parameter to your ArrayAdapter constructor, and you are not supplying a drop-down resource to that adapter either. Fix those two things and see if that clears up your problem. If not, hunt for other differences.
CommonsWare