Можно ли программно открыть Spinner в приложении для Android?

89

Если у вас есть дескриптор объекта Spinner в действии Android, можете ли вы программно открыть параметры счетчика - тем самым вынуждая пользователя выбрать вариант, даже если он не нажимал на Spinnerсебя?

JohnRock
источник
Что вы имеете в виду под объектом spinner, можете ли вы поделиться макетными скриншотами того, что вы хотите сделать
the100rabh
performClick()может быть недостаточно, если вы получите сообщение об Unable to add windowошибке, посмотрите, что делать здесь .
Protean

Ответы:

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
Думаю, это просто демонстрация, чтобы показать обработчик, работающий из отдельного потока.
Марк Ренуф,
11

Просто используйте это

yourspinner.performClick();
Чайон Ахмед
источник