Cómo configurar un spinner onClickListener () en Android

Estoy intentando conseguir un onClickListener para encender en un Spinner, pero consigo el error siguiente:

Java.lang.RuntimeException es "No invocar a setOnClickListener para un AdapterView. Probablemente querrá setOnItemClickListener en su lugar,"

Estoy seguro de que quiero llamar a onClickListener y no onItemClickListener. He encontrado una pregunta hecha por otra persona sobre el desbordamiento de la pila, ¿Hay una manera de utilizar setOnClickListener con un Spinner de Android?

La respuesta afirma que hay:

Tendrá que establecer el oyente de clic en la vista subyacente (normalmente, un TextView con id: android.R.id.text1) de la hiladora. Para hacerlo:

Crear un Spinner personalizado En el constructor (con atributos) crear el hilandero por el suministro de la disposición android.R.layout.simple_spinner_item Hacer un findViewById (android.R.id.text1) para obtener el TextView Ahora establecer el onClickListener a la TextView

He intentado la respuesta anotada allí, pero no parece trabajar. Consigo un puntero nulo al TextView después de que hago el findViewById ().

Esto es lo que estoy haciendo:

Spinner spinner = (Spinner) findViewById(R.id.spinner); ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.layoutspinner,dataArray); spinner.setAdapter(adapter); TextView SpinnerText = (TextView)findViewById(R.id.spinnerText); if (SpinnerText == null) { System.out.println("Not found"); } else { SpinnerText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View arg0) { //Do something } }); } 

Archivo layoutspinner.xml

 <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/spinnerText" android:singleLine ="true" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="6pt" android:gravity="right"/> 

¿Qué estoy haciendo mal?

Soy nuevo en el desbordamiento de la pila, no encontré ninguna manera de fijar una pregunta adicional al otro hilo (o el comentario puesto que tengo a pequeño representante) así que empecé una nueva pregunta.

Por recomendación He probado esto:

 int a = spinnerMes.getCount(); int b = spinnerMes.getChildCount(); System.out.println("Count = " + a); System.out.println("ChildCount = " + b); for (int i = 0; i < b; i++) { View v = spinnerMes.getChildAt(i); if (v == null) { System.out.println("View not found"); } else { v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //Click code } }); } } 

Pero LogCat no está mostrando resultados prometedores.

 10-14 16:09:08.127: INFO/System.out(3116): Count = 7 10-14 16:09:08.127: INFO/System.out(3116): ChildCount = 0 

He probado esto en los niveles API 7 y 8 con los mismos resultados.

Lo siguiente funciona como usted lo desea, pero no es ideal.

 public class Tester extends Activity { String[] vals = { "here", "are", "some", "values" }; Spinner spinner; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); spinner = (Spinner) findViewById(R.id.spin); ArrayAdapter<String> ad = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, vals); spinner.setAdapter(ad); Log.i("", "" + spinner.getChildCount()); Timer t = new Timer(); t.schedule(new TimerTask() { @Override public void run() { int a = spinner.getCount(); int b = spinner.getChildCount(); System.out.println("Count =" + a); System.out.println("ChildCount =" + b); for (int i = 0; i < b; i++) { View v = spinner.getChildAt(i); if (v == null) { System.out.println("View not found"); } else { v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i("","click"); } }); } } } }, 500); } } 

Déjeme saber exactamente cómo usted necesita el hilandero para comportarse, y podemos trabajar hacia fuera una solución mejor.

Aquí hay una solución de trabajo:

En lugar de configurar OnClickListener de la hiladora, estamos configurando OnTouchListener y OnKeyListener.

 spinner.setOnTouchListener(Spinner_OnTouch); spinner.setOnKeyListener(Spinner_OnKey); 

Y los oyentes:

 private View.OnTouchListener Spinner_OnTouch = new View.OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { doWhatYouWantHere(); } return true; } }; private static View.OnKeyListener Spinner_OnKey = new View.OnKeyListener() { public boolean onKey(View v, int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { doWhatYouWantHere(); return true; } else { return false; } } }; 

Siempre que tenga que realizar alguna acción con el clic del Spinner en Android, utilice el siguiente método.

 mspUserState.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { doWhatIsRequired(); } return false; } }); 

Una cosa a tener en cuenta siempre es devolver Falso mientras se utiliza el método anterior. Si devuelve True , los elementos desplegables de la ruleta no se mostrarán al hacer clic en el Spinner.

Personalmente, yo uso eso:

  final Spinner spinner = (Spinner) (view.findViewById(R.id.userList)); spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { userSelectedIndex = position; } @Override public void onNothingSelected(AdapterView<?> parent) { } }); 

En primer lugar, una ruleta no admite eventos de clic de artículo. Al llamar a este método se generará una excepción.

Puede utilizar setOnItemSelectedListener:

 Spinner s1; s1 = (Spinner)findViewById(R.id.s1); int selectionCurrent = s1.getSelectedItemPosition(); spinner.setOnItemSelectedListener(new OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) { if (selectionCurrent != position){ // Your code here } selectionCurrent= position; } } @Override public void onNothingSelected(AdapterView<?> parentView) { // Your code here } }); 

Sugiero que todos los eventos para Spinner se dividen en dos tipos:

  1. Eventos de usuario (lo que quería decir como evento de "clic").

  2. Eventos del programa.

También sugiero que cuando quiera capturar eventos de usuario sólo desea deshacerse de "eventos del programa". Así que es bastante simple:

 private void setSelectionWithoutDispatch(Spinner spinner, int position) { AdapterView.OnItemSelectedListener onItemSelectedListener = spinner.getOnItemSelectedListener(); spinner.setOnItemSelectedListener(null); spinner.setSelection(position, false); spinner.setOnItemSelectedListener(onItemSelectedListener); } 

Hay un momento clave: necesitas setSelection (position, false). "False" en el parámetro animation disparará el evento inmediatamente. El comportamiento predeterminado es empujar evento a cola de eventos.

  • ID de configuración de los elementos de Spinner
  • Android - Set Spinner Punto de inicio
  • Por que enNo se selecciona ningunoSeleccionado
  • Spinner no aplica el atributo dropDownSelector
  • Cómo cambiar el elemento de una ruleta en ActionBar mediante programación
  • Android Spinner Artículo seleccionado
  • ¿Cómo puedo cambiar o disminuir el tamaño de la ruleta de Android?
  • ¿Cómo obtener una devolución de llamada cuando se desactiva un diálogo emergente de Spinner?
  • Cómo deshabilitar onItemSelectedListener que se invocará al configurar el elemento seleccionado por código
  • Cómo colorear y alinear el elemento spinner en android?
  • Establecer el texto Gujarati en Spinner en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.