Möglich, einen Spinner in der Android-App programmgesteuert zu öffnen?

86

Wenn Sie ein Handle für ein Spinner- Objekt in einer Android-Aktivität haben, können Sie die Spinner-Optionen programmgesteuert öffnen und den Benutzer dazu zwingen, eine Option auszuwählen, obwohl er nicht auf sich Spinnerselbst geklickt hat?

JohnRock
quelle
was bedeuten u durch Schleuder Objekt, kann u Mock Screenshots teilen , was u tun wollen
the100rabh
performClick()Möglicherweise reicht dies nicht aus. Wenn Sie den Unable to add windowFehler erhalten, lesen Sie hier, was zu tun ist .
Protean

Antworten:

142

Um den Spinner zu öffnen, müssen Sie nur die performClick () -Methode aufrufen .

Beachten Sie, dass Sie diese Methode nur über den UI-Thread aufrufen dürfen. Wenn Sie den Spinner von einem separaten Thread aus öffnen müssen, sollten Sie einen Handler im UI-Thread erstellen und dann von Ihrem zweiten Thread aus ein ausführbares Objekt senden, das performClick () an den Handler aufruft.

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();
    }
}

Die in diesem Beispiel verwendeten Ressourcen finden Sie hier .

Tim Kryger
quelle
Vielen Dank. performClick () war das, wonach ich gesucht habe. Ich hätte diese Methode auf dem Spinner sehen sollen, habe sie aber aufgrund einiger Verwirrung an meinem Ende verpasst. Vielen Dank!
JohnRock
Was ist, wenn ich runOnUIThread für die Verwendung von perform click aus einem anderen Thread verwendet habe?
Relsell
Arbeitete vor 5.0.2, scheint auf 5.0.2 defekt zu sein (nur für einige Geräte), aber wieder auf 5.1 zu arbeiten ...
Benjamin Piette
24

Um die SpinnerElemente anzuzeigen, müssen Sie nur die performClick()Methode aufrufen .

Spinner spDeviceType = (Spinner) findViewById(R.id.spDeviceType);
spDeviceType.performClick();
Amintabar
quelle
15

Sie müssen nicht zwei ausführbare Dateien verwenden, wie im vorherigen Beispiel gezeigt.

Das wird reichen:

h.postDelayed(new Runnable() {
    public void run() {
        s.performClick();
    }
}, 5000);
Kovalenych
quelle
3
Ich denke, es ist nur eine Demo, um zu zeigen, wie der Handler von einem separaten Thread aus arbeitet.
Mark Renouf
11

Verwenden Sie dies einfach

yourspinner.performClick();
Chayon Ahmed
quelle