プログラムでAndroidアプリでスピナーを開くことは可能ですか?


88

AndroidアクティビティにSpinnerオブジェクトへのハンドルがある場合、プログラムでスピナーオプションをポップオープンできますSpinnerか?それにより、ユーザーが自分でクリックしなくてもオプションを選択するように強制できますか?


スピナーオブジェクトとはどういう意味
ですか、

performClick()あなたが取得する場合、十分ではないかもしれないUnable to add windowエラーを、何をすべきかをご覧くださいここに
変幻自在2018

回答:


143

スピナーを開くには、performClick()メソッドを呼び出す必要があります。

このメソッドはUIスレッドからのみ呼び出すことができることに注意してください。別のスレッドからスピナーを開く必要がある場合は、UIスレッドでハンドラーを作成してから、2番目のスレッドから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 2012

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
ハンドラーが別のスレッドから動作していることを示すのは単なるデモだと思います。
マーク・Renouf

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.