可以在Android应用中以编程方式打开Spinner吗?


89

如果您在Android Activity中具有Spinner对象的句柄,您是否可以以编程方式弹出打开Spinner选项-从而即使用户未单击Spinner自己,也迫使用户选择一个选项?


什么ü通过微调对象的意思,u能分享什么ü想要做的模拟截图
the100rabh

performClick()可能还不够,如果Unable to add window出现错误,请参阅此处的操作
Protean '18

Answers:


143

要打开微调框,您只需调用它的performClick()方法即可。

请记住,您只能从UI线程调用此方法。如果需要从单独的线程打开Spinner,则应在UI线程中创建一个Handler,然后从第二个线程向Handler发送一个调用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 2010年

如果我使用runOnUIThread来执行来自不同线程的点击,该怎么办。
Relsell

在5.0.2之前工作,似乎在5.0.2上损坏(仅适用于某些设备),但在5.1上又工作了……
Benjamin Piette 2015年

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
我认为这只是一个演示,以显示处理程序在单独的线程中工作。
马克·雷诺夫

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.