Saya ingin menggunakan Spinner yang awalnya (ketika pengguna belum membuat pilihan) menampilkan teks "Select One". Ketika pengguna mengklik pemintal, daftar item ditampilkan dan pengguna memilih salah satu opsi. Setelah pengguna membuat pilihan, item yang dipilih ditampilkan di Spinner alih-alih "Pilih Satu".
Saya memiliki kode berikut untuk membuat Spinner:
String[] items = new String[] {"One", "Two", "Three"};
Spinner spinner = (Spinner) findViewById(R.id.mySpinner);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, items);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
Dengan kode ini, awalnya item "Satu" ditampilkan. Saya hanya bisa menambahkan item baru "Pilih Satu" ke item, tetapi kemudian "Pilih Satu" juga akan ditampilkan dalam daftar dropdown sebagai item pertama, yang bukan yang saya inginkan.
Bagaimana saya bisa memperbaiki masalah ini?
android
android-spinner
Pieter Kuijpers
sumber
sumber
Jawaban:
Inilah solusi umum yang mengesampingkan
Spinner
tampilan. MenggantisetAdapter()
untuk mengatur posisi awal ke -1, dan proksi yang disediakanSpinnerAdapter
untuk menampilkan string prompt untuk posisi kurang dari 0.Ini telah diuji pada Android 1.5 hingga 4.2, tetapi pembeli berhati-hatilah! Karena solusi ini mengandalkan refleksi untuk memanggil pribadi
AdapterView.setNextSelectedPositionInt()
danAdapterView.setSelectedPositionInt()
, itu tidak dijamin untuk bekerja di pembaruan OS di masa depan. Tampaknya itu memang akan terjadi, tetapi tidak berarti dijamin.Biasanya saya tidak akan memaafkan sesuatu seperti ini, tetapi pertanyaan ini telah ditanyakan cukup banyak dan sepertinya permintaan yang cukup masuk akal yang saya pikir saya akan memposting solusi saya.
sumber
Yang dapat Anda lakukan adalah menghiasnya
SpinnerAdapter
dengan tampilan yang menampilkan 'Pilih Opsi ...' pada awalnya agar Spinner dapat ditampilkan tanpa ada yang dipilih.Berikut ini adalah contoh kerja yang diuji untuk Android 2.3, dan 4.0 (tidak menggunakan apa pun di perpustakaan kompatibilitas, jadi itu harus baik untuk sementara). Karena ini adalah dekorator, seharusnya mudah untuk memperbaiki kode yang ada dan berfungsi baik dengan
CursorLoader
s juga. (Tukar kursor pada bungkuscursorAdapter
tentu saja ...)Ada bug Android yang membuat ini sedikit lebih sulit untuk menggunakan kembali tampilan. (Jadi, Anda harus menggunakan
setTag
atau sesuatu yang lain untuk memastikan AndaconvertView
benar.) Spinner tidak mendukung beberapa jenis tampilanCatatan kode: 2 konstruktor
Ini memungkinkan Anda untuk menggunakan prompt standar atau menentukan sendiri 'tidak ada yang dipilih' sebagai baris pertama, atau keduanya, atau tidak sama sekali. (Catatan: Beberapa tema menunjukkan DropDown untuk Spinner alih-alih dialog. Dropdown biasanya tidak menampilkan prompt)
Anda menetapkan tata letak untuk 'terlihat' seperti prompt, misalnya, berwarna abu-abu ...
Menggunakan prompt standar (perhatikan bahwa tidak ada yang dipilih):
Atau dengan prompt dan sesuatu yang dinamis (bisa saja tidak memiliki prompt juga):
Penggunaan dalam contoh di atas
contact_spinner_row_nothing_selected.xml
NothingSelectedSpinnerAdapter.java
sumber
Saya akhirnya menggunakan sebagai
Button
gantinya. Meskipun aButton
bukan aSpinner
, perilaku tersebut mudah disesuaikan.Pertama buat Adaptor seperti biasa:
Perhatikan bahwa saya menggunakan
simple_spinner_dropdown_item
id tata letak. Ini akan membantu menciptakan tampilan yang lebih baik saat membuat dialog peringatan.Di pengendali onClick untuk Tombol saya, saya punya:
Dan itu dia!
sumber
Pertama, Anda mungkin tertarik pada
prompt
atributSpinner
kelas. Lihat gambar di bawah, "Pilih Planet" adalah prompt yang dapat diatur dalam XML denganandroid:prompt=""
.Saya akan menyarankan subclassing
Spinner
, di mana Anda dapat mempertahankan dua adapter secara internal. Satu adaptor yang memiliki opsi "Pilih Satu", dan adaptor nyata lainnya (dengan opsi aktual), lalu gunakanOnClickListener
untuk mengganti adaptor sebelum dialog pilihan ditampilkan. Namun, setelah mencoba menerapkan gagasan itu, saya sampai pada kesimpulan Anda tidak dapat menerimaOnClick
acara untuk widget itu sendiri.Anda bisa membungkus pemintal dalam tampilan yang berbeda, memotong klik pada tampilan, dan kemudian memberitahu Anda
CustomSpinner
untuk mengganti adaptor, tetapi tampaknya seperti peretasan yang mengerikan.Apakah Anda benar-benar perlu menunjukkan "Select One"?
sumber
Kode ini telah diuji dan berfungsi di Android 4.4
sumber
getItem(getCount())
Apakah yang digarisbawahi merah untuk saya? Tidak dapat menyelesaikan metode setHintSaya menemukan solusi ini:
Ubah saja array [0] dengan "Select One" dan kemudian di onItemSelected, ganti namanya menjadi "One".
Bukan solusi yang berkelas, tetapi berhasil: D
sumber
Tidak ada API default untuk memberi petunjuk pada Spinner. Untuk menambahkannya kita perlu solusi kecil tanpa implementasi refleksi keselamatan
Sumber adaptor:
Sumber asli
sumber
android.R.id.text1
getCount
metodeBanyak jawaban di sini tapi saya terkejut tidak ada yang menyarankan solusi sederhana: Tempatkan TextView di atas Spinner. Atur pendengar klik pada TextView yang menyembunyikan TextView memperlihatkan Spinner, dan panggil spinner.performClick ().
sumber
Saya mendapat masalah yang sama untuk pemintal, dengan pilihan kosong, dan saya menemukan solusi yang lebih baik. Lihatlah kode sederhana ini.
Di sini spinneradapter adalah penyesuaian kecil untuk arrayadapter. Ini terlihat seperti ini:
sumber
Anda dapat mengubahnya ke Tampilan Teks dan gunakan ini:
dan kemudian mendefinisikan
android:text
properti.sumber
File XML:
Aktivitas:
onCreate:
Beberapa fungsi (tambahkan beberapa hal ke adaptor secara terprogram)>
Sekarang Anda memiliki pemintal kosong dan Anda dapat menulis kode untuk tidak membuka dialog jika kosong. Atau mereka dapat menekan kembali. Tetapi Anda juga mengisinya dengan fungsi atau daftar lain selama waktu berjalan.
sumber
Saya sudah mencoba seperti berikut ini. Ambil tombol dan berikan event klik untuk itu. Dengan mengubah latar belakang tombol, tampaknya menjadi pemintal.
Deklarasikan sebagai variabel global alertdialog dan nilai default ..
sumber
Ini cara saya:
sumber
Lihatlah aplikasi iosched untuk solusi tujuan umum untuk menambahkan elemen ke bagian atas daftar. Khususnya, jika Anda menggunakan CursorAdapter, lihat TracksAdapter.java yang memperluas definisi itu untuk menyediakan metode "setHasAllItem" dan kode terkait untuk mengelola jumlah daftar untuk menangani item tambahan di atas.
Dengan menggunakan adaptor khusus, Anda dapat mengatur teks menjadi "Select One" atau apa pun yang ingin Anda sampaikan.
sumber
Saya memiliki spinner di main.xml saya dan id-nya
@+id/spinner1
inilah yang saya tulis di fungsi OnCreate saya:
Tidak perlu implementasi di kelas.
sumber
Saya menemukan banyak solusi bagus untuk ini. sebagian besar bekerja dengan menambahkan item ke ujung adaptor, dan tidak menampilkan item terakhir dalam daftar drop-down. Masalah besar bagi saya adalah daftar drop-down pemintal akan mulai dari bagian bawah daftar. Jadi pengguna melihat item terakhir alih-alih item pertama (jika memiliki banyak item untuk ditampilkan), setelah menyentuh pemintal untuk pertama kalinya.
Jadi saya meletakkan item petunjuk di awal daftar. dan sembunyikan item pertama dalam daftar drop-down.
atur tata letak di bawah ini di @Override getDropDownView () saat posisinya 0, untuk menyembunyikan baris petunjuk pertama.
R.layout.spinner_hint_list_item_layout:
sumber
Selain itu, Ada trik sederhana untuk menampilkan default:
Anda dapat menambahkan nilai default di daftar Anda dan kemudian menambahkan semua koleksi Anda menggunakan
list.addAll(yourCollection);
Contoh kode yang bisa diterapkan di sini:
Semoga ini memulihkan kompleksitas Anda. Selamat coding!
sumber
Saya pikir cara termudah adalah membuat item dummy pada indeks 0 mengatakan "pilih satu" dan kemudian menghemat mungkin memeriksa bahwa pemilihannya bukan 0.
sumber
Jadi ini adalah contoh terakhir saya "all-in" untuk pemintal tombol
Di activity_my_form.xml
Di strings.xml
Di MyFormActivity.java
Akhirnya saya memperoleh ukuran font yang dapat dikonfigurasi, tidak ada item pertama yang dapat dipilih pemintal tombol !!! Terima kasih kepada HRJ
sumber
Saat memanjang
SpinnerAdapter
, Anda mengganti duaView
metode penghasil,getView(int, View, ViewGroup)
dangetDropDownView(int, View, ViewGroup)
. Yang pertama memasok yangView
dimasukkan ke dalamSpinner
dirinya sendiri; yang kedua memasokView
dalam daftar drop-down (seperti namanya). Anda dapat mengesampingkangetView(...)
sehingga, sampai suatu item telah dipilih, itu akan menampilkanTextView
prompt yang berisi; kemudian, ketika Anda mendeteksi item telah dipilih, Anda mengubahnya untuk menampilkan yangTextView
sesuai dengan itu.sumber
Spinner
tutorial (yang seharusnya menampilkanToast
SETELAH Anda telah memilih item) OUGHT ini berfungsi: developer.android.com/resources/tutorials/views/…Bagi mereka yang menggunakan Xamarin, berikut adalah C # yang setara dengan jawaban aaronvargas di atas.
sumber
Saya juga memecahkan masalah ini dengan menggunakan kode berikut. Misalkan Anda memiliki daftar barang misalnya
Sekarang kita harus menyediakan string ke spinner karena spinner tidak dapat memahami objek. Jadi kita akan membuat daftar array baru dengan item string seperti ini ->
Sekarang kami memiliki
itemStringArrayList
daftar array dengan dua item string. Dan kita harus menunjukkan teks "Pilih Item" sebagai item pertama. Jadi kita harus memasukkan string baru ke dalamitemStringArrayList
.Sekarang kami memiliki daftar array
itemsArrayList
dan kami ingin menunjukkan dua elemen di drop down. Tetapi kondisinya di sini adalah ... Jika kita tidak memilih apa pun makaSelect Item
akan muncul elemen pertama yang tidak akan diaktifkan.Jadi kita bisa mengimplementasikan fungsi ini seperti ini. Jika Anda perlu memuat item daftar array ke spinner Android. Jadi, Anda harus menggunakan beberapa adaptor. Jadi di sini saya akan menggunakan
ArrayAdapter
. Kita dapat menggunakan adaptor penyesuaian juga.Di sini, di kode ini. kami menggunakan tata letak pemintal yang disesuaikan
R.layout.spinner_item
. Ini tampilan teks sederhanaKita perlu menonaktifkan teks pertama di pemintal. Jadi untuk posisi 0 kita menonaktifkan teks. Dan warna juga bisa kita atur dengan mengabaikan metode getDropDownView. Jadi dengan cara ini kita akan mendapatkan pemintal yang diharapkan.
sumber
Saya hanya akan menggunakan RadioGroup dengan RadioButtons jika Anda hanya memiliki tiga pilihan, Anda dapat membuat semuanya tidak dicentang pada awalnya.
sumber
Tidak satu pun dari jawaban yang dikirimkan sebelumnya benar-benar berfungsi seperti yang saya inginkan untuk menyelesaikan masalah ini. Bagi saya solusi ideal akan memberikan "Select One" (atau teks awal apa pun) saat spinner pertama kali ditampilkan. Ketika pengguna mengetuk spinner, teks awal tidak boleh menjadi bagian dari drop down yang ditampilkan.
Untuk semakin memperumit situasi khusus saya, data spinner saya datang membentuk kursor yang dimuat melalui callback LoaderManager.
Setelah bereksperimen cukup lama saya menemukan solusi berikut:
sumber
Saya menangani ini dengan menggunakan tombol, bukan Spinner. Saya memiliki proyek sampel di GitHub.
Dalam proyek ini, saya menampilkan Spinner dan tombol untuk menunjukkan bahwa mereka memang terlihat identik. Kecuali tombol, Anda dapat mengatur teks awal ke apa pun yang Anda inginkan.
Seperti apa kegiatannya:
CATATAN: Ya, saya menyadari bahwa ini tergantung pada Tema yang diterapkan dan tampilannya akan sedikit berbeda jika menggunakan Theme.Holo. Namun, jika Anda menggunakan salah satu tema lawas seperti Theme.Black, Anda siap melakukannya.
sumber
jika Anda menghadapi masalah ini saat item Anda terisi dari kursor basis data ,
solusi paling sederhana yang saya temukan dalam jawaban SO ini :
gunakan UNION di permintaan adaptor kursor Anda dan tambahkan item tambahan dengan id = -1 ke hasil permintaan, tanpa benar-benar menambahkannya ke DB:
sesuatu seperti:
jika item yang dipilih adalah -1, maka itu adalah nilai default. Kalau tidak, ini catatan dari tabel.
sumber
Tampaknya solusi biasa tapi saya biasanya meletakkan TextView di depan pemintal. Seluruh Xml terlihat seperti ini. (hai teman-teman, jangan tembak saya, saya tahu bahwa beberapa dari Anda tidak menyukai pernikahan semacam ini):
Lalu saya menyembunyikan TextView ketika Item dipilih. Jelas warna latar belakang TextView harus sama dengan Spinner. Bekerja di Android 4.0. Tidak tahu di versi yang lebih lama.
Iya. Karena Spinner memanggil setOnItemSelectedListener di awal, menyembunyikan tampilan teks bisa sedikit rumit, tetapi dapat dilakukan dengan cara ini:
sumber
bagi saya itu bekerja seperti ini. memiliki peningkatan yang hanya mengubah teks dalam opsi BEBERAPA, tidak semuanya.
Pertama saya mengambil nama-nama pemintal dan membuat arrayadapter dengan tampilan kustomisasi, tetapi tidak masalah sekarang, kuncinya adalah menimpa getView, dan di dalam mengubah nilai-nilai yang perlu Anda ubah. Dalam kasus saya hanya yang pertama, sisanya saya tinggalkan yang asli
sumber
ini yang sederhana
sumber
Lihat salah satu jawaban di atas: https://stackoverflow.com/a/23005376/1312796
Saya menambahkan kode saya untuk memperbaiki bug kecil. Di mana tidak ada data yang diambil .. Bagaimana menampilkan teks prompt ..!
Ini Trik saya ... Ini berfungsi dengan baik untuk saya. !
Cobalah untuk meletakkan pemintal Anda di Relative_layout dan menyelaraskan Textview dengan pemintal Anda dan bermain dengan visibilitas Textview (SHOW / HIDE) setiap kali adaptor pemintal dimuat atau kosong..Seperti ini:
Ini kodenya:
panggil metode ini setelah dan sebelum adaptor pemintal dimuat dan kosong.
sumber