Possibilité d'ouvrir par programme un Spinner dans une application Android?

89

Si vous avez un handle vers un objet Spinner dans une activité Android, pouvez-vous ouvrir les options de spinner par programmation - obligeant ainsi l'utilisateur à choisir une option même s'il n'a pas cliqué dessus Spinner?

JohnRock
la source
que voulez-vous dire par objet spinner, pouvez-vous partager des captures d'écran simulées de ce que vous voulez faire
the100rabh
performClick()peut ne pas suffire, si vous obtenez l' Unable to add windowerreur, voyez ce qu'il faut faire ici .
Protean

Réponses:

143

Pour ouvrir le Spinner, il vous suffit d'appeler sa méthode performClick () .

Gardez à l'esprit que vous ne pouvez appeler cette méthode qu'à partir du thread d'interface utilisateur. Si vous devez ouvrir le Spinner à partir d'un thread distinct, vous devez créer un gestionnaire dans le thread d'interface utilisateur, puis, à partir de votre deuxième thread, envoyer un objet exécutable qui appelle performClick () au gestionnaire.

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();
    }
}

Les ressources utilisées par cet exemple peuvent être trouvées ici .

Tim Kryger
la source
Merci. performClick () était ce que je recherchais. J'aurais dû voir cette méthode sur le spinner mais je l'ai ratée en raison d'une certaine confusion de mon côté. Merci beaucoup!
JohnRock
Et si j'utilisais runOnUIThread pour utiliser perform click à partir d'un thread différent.
Relsell
Travaillé avant 5.0.2, semble être cassé sur 5.0.2 (uniquement pour certains appareils), mais travaille à nouveau sur 5.1 ...
Benjamin Piette
24

Pour afficher les Spinneréléments, il vous suffit d'appeler sa performClick()méthode.

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

Vous n'avez pas besoin d'utiliser 2 exécutables comme indiqué dans l'exemple précédent.

Cela suffira:

h.postDelayed(new Runnable() {
    public void run() {
        s.performClick();
    }
}, 5000);
Kovalenych
la source
3
Je pense que c'est juste une démo pour montrer le gestionnaire travaillant à partir d'un thread séparé.
Mark Renouf
11

Utilisez simplement ceci

yourspinner.performClick();
Chayon Ahmed
la source