È possibile aprire a livello di codice uno Spinner nell'app Android?


89

Se hai un handle per un oggetto Spinner in un'attività Android, puoi aprire in modo programmatico le opzioni di spinner, costringendo così l'utente a scegliere un'opzione anche se non ha fatto clic su Spinnerse stesso?


cosa intendi per oggetto spinner, puoi condividere schermate
fittizie

performClick()potrebbe non essere sufficiente, se ottieni l' Unable to add windowerrore, guarda cosa fare qui .
Protean

Risposte:


146

Per aprire lo Spinner devi solo chiamare il suo metodo performClick () .

Tieni presente che puoi chiamare questo metodo solo dal thread dell'interfaccia utente. Se è necessario aprire lo Spinner da un thread separato, è necessario creare un gestore nel thread dell'interfaccia utente e quindi, dal secondo thread, inviare un oggetto eseguibile che chiama performClick () al gestore.

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

Le risorse utilizzate da questo esempio possono essere trovate qui .


Grazie. performClick () era quello che stavo cercando. Avrei dovuto vedere quel metodo sullo spinner ma l'ho perso a causa di una certa confusione da parte mia. Molte grazie!
JohnRock

E se avessi usato runOnUIThread per usare il clic di esecuzione da un thread diverso.
Relsell

Funzionava prima della 5.0.2, sembra non funzionare sulla 5.0.2 (solo per alcuni dispositivi), ma funziona di nuovo sulla 5.1 ...
Benjamin Piette

Quando si utilizza una finestra di dialogo, il mio spinner si apre dietro la finestra di dialogo utilizzando performClick (); Qualche soluzione per questo?
Huzaifa Asif

26

Per mostrare gli Spinnerelementi devi solo chiamare il suo performClick()metodo.

Spinner spDeviceType = (Spinner) findViewById(R.id.spDeviceType);
spDeviceType.performClick();

17

Non è necessario utilizzare 2 eseguibili come mostrato nell'esempio precedente.

Questo sarà sufficiente:

h.postDelayed(new Runnable() {
    public void run() {
        s.performClick();
    }
}, 5000);

3
Penso che sia solo una demo per mostrare il gestore che lavora da un thread separato.
Mark Renouf

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.