Czy można programowo otworzyć Spinner w aplikacji na Androida?

89

Jeśli masz uchwyt do obiektu Spinner w działaniu Androida, czy możesz programowo otworzyć opcje pokrętła - w ten sposób zmuszając użytkownika do wybrania opcji, mimo że sam nie Spinnerkliknął?

JohnRock
źródło
co masz na myśli przez obiekt typu spinner, czy możesz udostępniać fałszywe zrzuty ekranu z tego, co chcesz zrobić
the100rabh
performClick()może nie wystarczyć, jeśli Unable to add windowpojawi się błąd, zobacz, co robić tutaj .
Protean

Odpowiedzi:

143

Aby otworzyć Spinner, wystarczy wywołać jego metodę performClick () .

Pamiętaj, że możesz wywołać tę metodę tylko z wątku interfejsu użytkownika. Jeśli chcesz otworzyć Spinner z osobnego wątku, powinieneś utworzyć Handler w wątku UI, a następnie, z drugiego wątku, wysłać uruchamialny obiekt, który wywołuje performClick () do 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();
    }
}

Zasoby używane w tym przykładzie można znaleźć tutaj .

Tim Kryger
źródło
Dzięki. PerformClick () było tym, czego szukałem. Powinienem był zobaczyć tę metodę na przędzarce, ale przegapiłem ją z powodu pewnego zamieszania na moim końcu. Wielkie dzięki!
JohnRock
A co, jeśli użyję runOnUIThread do użycia funkcji perform click z innego wątku.
Relsell
Działał przed 5.0.2, wydaje się być zepsuty w 5.0.2 (tylko dla niektórych urządzeń), ale działa ponownie na 5.1 ...
Benjamin Piette
24

Aby wyświetlić Spinnerelementy, wystarczy wywołać jego performClick()metodę.

Spinner spDeviceType = (Spinner) findViewById(R.id.spDeviceType);
spDeviceType.performClick();
Amintabar
źródło
16

Nie musisz używać 2 elementów wykonawczych, jak pokazano w poprzednim przykładzie.

To wystarczy:

h.postDelayed(new Runnable() {
    public void run() {
        s.performClick();
    }
}, 5000);
Kovalenych
źródło
3
Myślę, że to tylko demo, aby pokazać obsługę działającą z osobnego wątku.
Mark Renouf
11

Po prostu użyj tego

yourspinner.performClick();
Chayon Ahmed
źródło