เป็นไปได้ที่จะเปิด Spinner ในแอป Android โดยใช้โปรแกรมหรือไม่


89

หากคุณมีที่จับวัตถุSpinnerในกิจกรรม Android คุณสามารถเปิดตัวเลือกสปินเนอร์โดยใช้โปรแกรมได้หรือไม่โดยบังคับให้ผู้ใช้เลือกตัวเลือกแม้ว่าพวกเขาจะไม่ได้คลิกที่Spinnerตัวเอง


คุณหมายถึงอะไรโดยวัตถุสปินเนอร์คุณสามารถแชร์ภาพหน้าจอจำลองของสิ่งที่คุณต้องการทำได้หรือไม่
the100rabh

performClick()อาจจะไม่เพียงพอหากคุณได้รับUnable to add windowข้อผิดพลาดให้ดูว่าจะทำอย่างไรที่นี่
Protean

คำตอบ:


146

ในการเปิด Spinner คุณต้องเรียกมันว่าวิธีการ performClick ()

โปรดทราบว่าคุณสามารถเรียกใช้เมธอดนี้ได้จากเธรด UI เท่านั้น หากคุณต้องการเปิด Spinner จากเธรดแยกต่างหากคุณควรสร้างHandlerในเธรด UI จากนั้นจากเธรดที่สองของคุณให้ส่งอ็อบเจ็กต์ที่รันได้ซึ่งเรียกใช้ performClick () ไปยัง 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();
    }
}

ทรัพยากรที่ใช้โดยตัวอย่างนี้สามารถพบได้ที่นี่


ขอบคุณ. PerformClick () คือสิ่งที่ฉันกำลังมองหา ฉันน่าจะเห็นวิธีการนั้นบนสปินเนอร์ แต่พลาดไปเนื่องจากความสับสนในตอนท้ายของฉัน ขอบคุณมาก!
JohnRock

จะเกิดอะไรขึ้นถ้าฉันใช้ runOnUIThread เพื่อใช้ทำการคลิกจากเธรดอื่น
Relsell

ทำงานก่อน 5.0.2 ดูเหมือนจะเสียใน 5.0.2 (เฉพาะบางอุปกรณ์) แต่ทำงานอีกครั้งใน 5.1 ...
Benjamin Piette

เมื่อใช้กล่องโต้ตอบสปินเนอร์ของฉันจะเปิดอยู่ด้านหลังกล่องโต้ตอบโดยใช้ performClick (); วิธีแก้ปัญหานี้หรือไม่?
Huzaifa Asif

26

ในการแสดงSpinnerรายการคุณต้องเรียกมันว่าperformClick()วิธีการ

Spinner spDeviceType = (Spinner) findViewById(R.id.spDeviceType);
spDeviceType.performClick();

17

คุณไม่จำเป็นต้องใช้ 2 runnables ดังที่แสดงในตัวอย่างก่อนหน้านี้

แค่นี้ก็เพียงพอแล้ว:

h.postDelayed(new Runnable() {
    public void run() {
        s.performClick();
    }
}, 5000);

3
ฉันคิดว่ามันเป็นเพียงการสาธิตเพื่อแสดงตัวจัดการที่ทำงานจากเธรดแยกต่างหาก
Mark Renouf

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.