É possível abrir programaticamente um Spinner no aplicativo Android?

89

Se você tiver um identificador para um objeto Spinner em uma atividade Android, pode abrir programaticamente as opções do spinner - forçando assim o usuário a escolher uma opção, mesmo que ele não tenha clicado em Spinnersi mesmo?

JohnRock
fonte
O que você quer dizer com objeto giratório, você pode compartilhar capturas de tela simuladas do que você deseja fazer
the100rabh
performClick()pode não ser suficiente, se você obtiver o Unable to add windowerro, veja o que fazer aqui .
Protean de

Respostas:

146

Para abrir o Spinner você só precisa chamar o método performClick () .

Lembre-se de que você só pode chamar esse método a partir do thread da IU. Se você precisar abrir o Spinner de um thread separado, deve criar um Handler no thread de IU e, a partir do segundo thread, enviar um objeto executável que chama performClick () para o 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();
    }
}

Os recursos usados ​​por este exemplo podem ser encontrados aqui .

Tim Kryger
fonte
Obrigado. performClick () era o que eu procurava. Eu deveria ter visto esse método no botão giratório, mas perdi devido a alguma confusão no meu lado. Muito obrigado!
JohnRock de
E se eu usasse runOnUIThread para usar executar clique de um tópico diferente.
Relsell de
Funcionou antes do 5.0.2, parece estar quebrado no 5.0.2 (apenas para alguns dispositivos), mas funcionando novamente no 5.1 ...
Benjamin Piette
Ao usar uma caixa de diálogo, meu controle giratório é aberto atrás da caixa de diálogo usando performClick (); Alguma solução para isso?
Huzaifa Asif
26

Para mostrar os Spinneritens você só precisa chamar seu performClick()método.

Spinner spDeviceType = (Spinner) findViewById(R.id.spDeviceType);
spDeviceType.performClick();
Amintabar
fonte
17

Você não precisa usar 2 runnables, conforme mostrado no exemplo anterior.

Isso será o suficiente:

h.postDelayed(new Runnable() {
    public void run() {
        s.performClick();
    }
}, 5000);
Kovalenych
fonte
3
Acho que é apenas uma demonstração para mostrar o manipulador trabalhando em um thread separado.
Mark Renouf
11

Basta usar isso

yourspinner.performClick();
Chayon Ahmed
fonte