java - recorrer - Configuración de un spinner onClickListener() en Android
setselection spinner android (6)
Estoy intentando que un onClickListener dispare un Spinner, pero recibo el siguiente error:
Java.lang.RuntimeException es "No llame a setOnClickListener para un AdapterView. Probablemente desee setOnItemClickListener"
Estoy seguro de que quiero llamar onClickListener y NO onItemClickListener. Encontré una pregunta formulada por alguien más en Stack Overflow, ¿Hay alguna forma de usar setOnClickListener con un dispositivo Android Spinner?
La respuesta dice que hay:
Tendrá que configurar el detector de clics en la vista subyacente (normalmente un TextView con id: android.R.id.text1) de la flecha giratoria. Para hacerlo:
Cree un Spinner personalizado. En el constructor (con atributos), cree el spinner proporcionando el diseño android.R.layout.simple_spinner_item.
He intentado la respuesta anotada allí, pero no parece funcionar. Obtengo un puntero nulo a TextView después de hacer 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 Stack Overflow, no encontré ninguna forma de publicar una pregunta adicional en el otro hilo (o comentario, ya que tengo una pequeña repetición), así que empecé una nueva pregunta.
Por recomendación he intentado 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 niveles API 7 y 8 con los mismos resultados.
Aquí hay una solución de trabajo:
En lugar de configurar OnClickListener de la ruleta, 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;
}
}
};
En primer lugar, una rueda giratoria no admite eventos de clic de elementos. Llamar a este método provocará una excepción.
Puedes usar 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
}
});
Lo siguiente funciona como lo quieres, pero no es lo 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 necesita que se comporte el hilandero, y podemos encontrar una mejor solución.
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) {
}
});
Siempre que tenga que realizar alguna acción con el clic del Spinner en Android, use 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 es siempre devolver False mientras se usa el método anterior. Si regresa Verdadero , los elementos del menú desplegable no se mostrarán al hacer clic en el Spinner.
Sugiero que todos los eventos para Spinner se dividen en dos tipos:
Eventos de usuario (usted quiso decir como evento "clic").
Eventos del programa.
También sugiero que cuando quiera capturar un evento de usuario, solo quiera deshacerse de los "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). "falso" en el parámetro de animación disparará el evento inmediatamente. El comportamiento predeterminado es empujar la cola de eventos a eventos.