¿Es posible abrir mediante programación un Spinner en una aplicación de Android?

89

Si tiene un identificador para un objeto Spinner en una actividad de Android, ¿puede abrir mediante programación las opciones del spinner, obligando así al usuario a elegir una opción aunque no haya hecho clic en Spinnerellos mismos?

JohnRock
fuente
¿qué entendemos por u objeto spinner, u puede compartir imágenes simuladas de lo que quieres hacer
the100rabh
performClick()puede que no sea suficiente, si recibe el Unable to add windowerror, vea qué hacer aquí .
Protean

Respuestas:

143

Para abrir el Spinner, solo necesita llamar a su método performClick () .

Tenga en cuenta que solo puede llamar a este método desde el hilo de la interfaz de usuario. Si necesita abrir Spinner desde un hilo separado, debe crear un Handler en el hilo de la interfaz de usuario y luego, desde su segundo hilo, enviar un objeto ejecutable que llame a performClick () al Handler.

package com.example.SpinnerDemo;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.os.Handler;

public class SpinnerDemo extends Activity {

    private Handler h;
    private Spinner s;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        h = new Handler();

        s = (Spinner) findViewById(R.id.spinner);
        ArrayAdapter adapter = ArrayAdapter.createFromResource(this,
                R.array.planets, android.R.layout.simple_spinner_item);
        adapter.setDropDownViewResource(
                android.R.layout.simple_spinner_dropdown_item);
        s.setAdapter(adapter);

        // Open the Spinner...
        s.performClick();

        // Spawn a thread that triggers the Spinner to open after 5 seconds...
        new Thread(new Runnable() {
            public void run() {
                // DO NOT ATTEMPT TO DIRECTLY UPDATE THE UI HERE, IT WON'T WORK!
                // YOU MUST POST THE WORK TO THE UI THREAD'S HANDLER
                h.postDelayed(new Runnable() {
                    public void run() {
                        // Open the Spinner...
                        s.performClick();
                    }
                }, 5000);
            }
        }).start();
    }
}

Los recursos utilizados por este ejemplo se pueden encontrar aquí .

Tim Kryger
fuente
Gracias. performClick () era lo que estaba buscando. Debería haber visto ese método en la ruleta, pero me lo perdí debido a una cierta confusión por mi parte. ¡Muchas gracias!
JohnRock
¿Qué pasa si usé runOnUIThread para usar realizar clic desde un hilo diferente?
Relsell
Trabajó antes de 5.0.2, parece estar roto en 5.0.2 (solo para algunos dispositivos), pero trabajando nuevamente en 5.1 ...
Benjamin Piette
24

Para mostrar los Spinnerelementos, solo necesita llamar a su performClick()método.

Spinner spDeviceType = (Spinner) findViewById(R.id.spDeviceType);
spDeviceType.performClick();
Amintabar
fuente
16

No es necesario utilizar 2 ejecutables como se muestra en el ejemplo anterior.

Con esto bastará:

h.postDelayed(new Runnable() {
    public void run() {
        s.performClick();
    }
}, 5000);
Kovalenych
fuente
3
Creo que es solo una demostración para mostrar al controlador trabajando desde un hilo separado.
Mark Renouf
11

Simplemente usa esto

yourspinner.performClick();
Chayon Ahmed
fuente