Можливо програмно відкрити 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.