2009-10-31 21 views
6

Tengo un Android Spinner y me gustaría obtener una devolución de llamada cuando el usuario selecciona algo de su diálogo emergente. Parece que setOnItemClickListener() o setOnItemSelectedListener() sería el método correcto de usar, pero ninguno de ellos se invoca cuando selecciono uno de los elementos en la ruleta.¿Cómo obtener una devolución de llamada cuando se cierra un cuadro emergente de Spinner?

¿Hay una forma correcta de hacerlo?

ACTUALIZACIÓN

Por sugerencia de commonsware, hice lo siguiente, pero mi método onItemSelected() no se está llamando:

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 
     } 

    }); 

Respuesta

1

Uso setOnItemSelectedListener(). Aquí está uno de mis 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(""); 
    } 
} 
+1

Gracias por ese código, commonsware. Lo probé y no funciona para mí. El oyente 'onItemSelected()' nunca se llama por alguna razón. Ver mi actualización arriba. ¿Algunas ideas? – emmby

+0

Usted no está usando mi código en absoluto. Si compara los dos, verá que no está utilizando un recurso Spinner en el segundo parámetro para su constructor ArrayAdapter, y tampoco está suministrando un recurso desplegable a ese adaptador. Arregle esas dos cosas y vea si eso aclara su problema. Si no, busca otras diferencias. – CommonsWare

+10

Este es un código muy útil, pero no cubre el caso en el que el usuario 'aborta' la ruleta (es decir, toca fuera de la ruleta para cerrarla). El código de Spinner nativo tiene un defecto importante: no hay eventos de escucha o devolución de llamada para abrir o cerrar la ventana emergente o el cuadro de diálogo. Por ejemplo, parece imposible cambiar el encabezado giratorio basado en una ventana emergente abierta o cerrada (tal vez cambiar una flecha o algo así). – Batdude

Cuestiones relacionadas