在Android应用中,是否可以通过编程的方式打开下拉菜单?

93
如果您在安卓活动中有一个对 Spinner 对象的处理,那么是否可以通过编程方式弹出 Spinner 选项,从而强制用户选择选项即使他们没有点击 Spinner?

您说的Spinner对象是什么意思?您能分享一下您想要做的模拟截图吗? - the100rabh
如果你遇到了Unable to add window错误,那么仅仅使用performClick()可能不够。请查看这里中的解决方法。 - Protean
6个回答

151

要打开Spinner,您只需要调用其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
如果我在不同的线程中使用runOnUIThread来执行点击操作会怎样? - Relsell
之前在5.0.2版本上能够正常工作,但在某些设备上似乎出现了问题,不过在5.1版本上又恢复正常了。 - Benjamin Piette
当使用对话框时,我的微调控件在使用performClick()时会在对话框后面打开。有什么解决办法吗? - Huzaifa Asif

26
为了显示“Spinner”项目,您只需要调用它的“performClick()”方法。
Spinner spDeviceType = (Spinner) findViewById(R.id.spDeviceType);
spDeviceType.performClick();

17

你不需要像之前的示例一样使用两个runnable。

这就足够了:

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

4
我认为这只是一个演示,展示了处理程序在单独线程中运行的工作方式。 - Mark Renouf

11

只需使用此功能

yourspinner.performClick();

0
@Override
protected void onResume() {
 super.onResume();
 _spinner_operations.performClick();
}

你需要在onResume中调用,在onCreate中这样不起作用。


0

在 UI 线程完成其当前操作后,您可以调用 performClick()。如果您不使用 post {},则可能无法看到 Spinner 打开。

findViewById<Spinner>(R.id.spinner).post {
    performClick()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接