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?


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 .


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

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

3
Je pense que c'est juste une démo pour montrer le gestionnaire travaillant à partir d'un thread séparé.
Mark Renouf

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.