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?


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 .


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

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

3
Saya pikir ini hanya demo untuk menunjukkan pawang bekerja dari utas terpisah.
Mark Renouf

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.