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?


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 .


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

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

3
Ich denke, es ist nur eine Demo, um zu zeigen, wie der Handler von einem separaten Thread aus arbeitet.
Mark Renouf

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.