Можливо програмно відкрити Spinner в додатку Android?


88

Якщо у вас є дескриптор об’єкта Spinner в Android Activity, чи можете ви програмно відкрити параметри вертушки - тим самим змусивши користувача вибрати параметр, навіть якщо він не натиснув Spinnerсам?


що ти маєш на увазі під обертом, можеш поділитися фіктивними скріншотами того, що ти хочеш зробити
the100rabh

performClick()може бути недостатньо, якщо ви отримаєте Unable to add windowпомилку, подивіться, що тут робити .
Протеян

Відповіді:


143

Щоб відкрити Spinner, вам просто потрібно зателефонувати за методом performClick () .

Майте на увазі, що цей метод можна викликати лише з потоку інтерфейсу користувача. Якщо вам потрібно відкрити Spinner з окремого потоку, вам слід створити обробник у потоці інтерфейсу користувача, а потім, з вашого другого потоку, надіслати запущений об'єкт, який викликає performClick (), до обробника.

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

Ресурси, використані в цьому прикладі, можна знайти тут .


Дякую. performClick () - це те, що я шукав. Я повинен був бачити цей метод на блешні, але пропустив його через певну плутанину на моєму кінці. Дуже дякую!
JohnRock,

Що, якби я використовував runOnUIThread для використання, виконайте клацання з іншого потоку.
Relsell

Працював до 5.0.2, здається, не працює на 5.0.2 (лише для деяких пристроїв), але знову працює на 5.1 ...
Бенджамін Піетт

24

Щоб показати Spinnerелементи, вам просто потрібно викликати його performClick()метод.

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

16

Вам не потрібно використовувати 2 запуску, як показано в попередньому прикладі.

Цього буде достатньо:

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

3
Я думаю, що це просто демонстрація демонстрації обробника, що працює з окремого потоку.
Марк Ренуф,

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.