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.
- Alinear la flecha giratoria a la derecha del elemento seleccionado actualmente
- Android spinner con subrayado appcompat
- Android: cómo puedo obtener el tamaño de la matriz de cadena?
- Uso correcto de un Spinner, siguiendo las directrices de diseño del material
- ¿Cómo podemos crear hilanderos similares a iPhone en android?
- Android- múltiples hilanderos
- SetOnItemClickListener no funciona con Spinner
- ¿Cómo obtener el número de elementos en un spinner?
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:
-
Eventos de usuario (lo que quería decir como evento de "clic").
-
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.
- Ocultar el tiempo en la notificación de Android sin utilizar diseño personalizado
- Registrar receptor en un servicio