Mungkin secara terprogram membuka Spinner di aplikasi Android?

89

Jika Anda memiliki pegangan ke objek Spinner di Aktivitas Android, dapatkah Anda secara terprogram membuka opsi spinner - sehingga memaksa pengguna untuk memilih opsi meskipun mereka tidak mengkliknya Spinnersendiri?

JohnRock
sumber
apa yang Anda maksud dengan objek pemintal, dapatkah Anda berbagi tangkapan layar tiruan tentang apa yang ingin Anda lakukan
the100rabh
performClick()mungkin tidak cukup, jika mendapatkan Unable to add windowerror tersebut, lihat apa yang harus dilakukan disini .
Protean

Jawaban:

146

Untuk membuka Spinner, Anda hanya perlu memanggil metode performClick () .

Perlu diingat bahwa Anda hanya dapat memanggil metode ini dari UI thread. Jika Anda perlu membuka Spinner dari utas terpisah, Anda harus membuat Handler di utas UI dan kemudian, dari utas kedua, kirim objek runnable yang memanggil performClick () ke Handler.

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

Sumber daya yang digunakan oleh contoh ini dapat ditemukan di sini .

Tim Kryger
sumber
Terima kasih. performClick () adalah yang saya cari. Saya seharusnya melihat metode itu pada pemintal tetapi melewatkannya karena kebingungan di pihak saya. Terima kasih banyak!
JohnRock
Bagaimana jika saya menggunakan runOnUIThread untuk menggunakan melakukan klik dari utas yang berbeda.
Relsell
Bekerja sebelum 5.0.2, tampaknya rusak pada 5.0.2 (hanya untuk beberapa perangkat), tetapi bekerja lagi pada 5.1 ...
Benjamin Piette
Saat menggunakan dialog spinner saya terbuka di belakang dialog menggunakan performClick (); Ada solusi untuk ini?
Huzaifa Asif
26

Untuk menampilkan Spinneritem Anda hanya perlu memanggil performClick()metode itu.

Spinner spDeviceType = (Spinner) findViewById(R.id.spDeviceType);
spDeviceType.performClick();
Amintabar
sumber
17

Anda tidak perlu menggunakan 2 runnable seperti yang ditunjukkan pada contoh sebelumnya.

Ini sudah cukup:

h.postDelayed(new Runnable() {
    public void run() {
        s.performClick();
    }
}, 5000);
Kovalenych
sumber
3
Saya pikir ini hanya demo untuk menunjukkan pawang bekerja dari utas terpisah.
Mark Renouf
11

Cukup gunakan ini

yourspinner.performClick();
Chayon Ahmed
sumber