Saya membuat aplikasi Android dengan a Spinner
dan a TextView
. Saya ingin menampilkan item yang dipilih dari daftar tarik Spinner di TextView. Saya menerapkan Spinner dalam onCreate
metode sehingga ketika saya menjalankan program, itu menunjukkan nilai dalam TextView
(sebelum memilih item dari daftar drop-down).
Saya ingin menunjukkan nilai di TextView hanya setelah memilih item dari daftar turun bawah. Bagaimana saya melakukan ini?
Ini kode saya:
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
public class GPACal01Activity extends Activity implements OnItemSelectedListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Spinner spinner = (Spinner) findViewById(R.id.noOfSubjects);
// Create an ArrayAdapter using the string array and a default spinner layout
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,R.array.noofsubjects_array, android.R.layout.simple_spinner_item);
// Specify the layout to use when the list of choices appears
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(this);
}
public void onItemSelected(AdapterView<?> parent, View arg1, int pos,long id) {
TextView textView = (TextView) findViewById(R.id.textView1);
String str = (String) parent.getItemAtPosition(pos);
textView.setText(str);
}
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
}
Jawaban:
Jadi pertama kali menangani ini dengan nilai Integer
Contoh: Awalnya Ambil
int check = 0;
Anda dapat melakukannya dengan nilai boolean dan juga dengan memeriksa posisi saat ini dan sebelumnya. Lihat disini
sumber
Cukup letakkan baris ini sebelum mengatur OnItemSelectedListener
sumber
setSelection(int, boolean)
panggilansetSelectionInt()
internal, dan Anda perlu mengatur pendengar setelah (daripada sebelumnya) memanggil ini. Waspadalah itusetSelection(int)
tidak akan berhasil, karena itu panggilansetNextSelectedPositionInt()
internal, dan inilah yang membawa saya ke sini.Dimulai dengan API level 3 Anda dapat menggunakan onUserInteraction () pada Aktivitas dengan boolean untuk menentukan apakah pengguna berinteraksi dengan perangkat.
http://developer.android.com/reference/android/app/Activity.html#onUserInteraction ()
Sebagai bidang pada Kegiatan yang saya miliki:
Akhirnya, pemintal saya:
Saat Anda datang dan pergi melalui aktivitas, boolean diatur ulang ke false. Bekerja seperti pesona.
sumber
Ini berhasil untuk saya
Inisialisasi Spinner di Android bermasalah kadang-kadang masalah di atas diselesaikan dengan pola ini.
Pengaturan adaptor harus menjadi bagian pertama dan onItemSelectedListener (ini) akan menjadi yang terakhir saat menginisialisasi pemintal. Dengan pola di atas OnItemSelected () saya tidak dipanggil selama inisialisasi spinner
sumber
haha ... Saya punya pertanyaan yang sama. Ketika initViews () lakukan saja seperti ini. Urutan adalah kuncinya, pendengar adalah yang terakhir. Semoga berhasil !
sumber
Solusi saya:
sumber
Untuk menghindari memanggil spinner.setOnItemSelectedListener () selama inisialisasi
sumber
Anda dapat melakukan ini dengan cara ini:
Pada awalnya saya membuat pendengar dan dikaitkan dengan panggilan balik variabel; maka saya membuat pendengar kedua anonim dan ketika ini dipanggil pertama kali, ini mengubah pendengar =]
sumber
Bendera interaksi pengguna kemudian dapat disetel ke true dalam metode onTouch dan mengatur ulang
onItemSelected()
begitu perubahan pemilihan telah ditangani. Saya lebih suka solusi ini karena flag interaksi pengguna ditangani secara eksklusif untuk pemintal, dan bukan untuk tampilan lain dalam aktivitas yang dapat memengaruhi perilaku yang diinginkan.Dalam kode:
Buat pendengar Anda untuk pemintal:
Menambahkan pendengar untuk pemintal baik sebagai
OnItemSelectedListener
danOnTouchListener
:sumber
Solusi sederhana serupa yang memungkinkan banyak pemintal adalah dengan menempatkan AdapterView dalam koleksi - di dalam superclass Kegiatan - pada eksekusi pertama padaItItSelected (...) Kemudian periksa untuk melihat apakah AdapterView ada di koleksi sebelum menjalankannya. Ini memungkinkan satu set metode dalam superclass dan mendukung beberapa AdapterViews dan beberapa pemintal.
Superclass ...
Subkelas ...
}
sumber
buat bidang boolean
di dalam membuat aktivitas
sumber
Coba ini
sumber
Anda bisa mencapainya dengan setOnTouchListener terlebih dahulu kemudian setOnItemSelectedListener di onTouch
sumber
Ini bekerja untuk saya:
sumber
Berdasarkan jawaban Abhi saya membuat pendengar sederhana ini
sumber
Punya masalah yang sama dan ini bekerja untuk saya:
Saya memiliki 2 pemintal dan saya memperbaruinya selama init dan selama interaksi dengan kontrol lain atau setelah mendapatkan data dari server.
Ini templat saya:
Ketika kelas memulai gunakan setSpinnersListeners () alih-alih langsung mengatur pendengar.
Runnable akan mencegah spinner menembakkan onItemSelected tepat setelah Anda menetapkan nilainya.
Jika Anda perlu memperbarui pemintal (setelah panggilan server dll.) Gunakan removeSpinnersListeners () tepat sebelum jalur pembaruan Anda, dan setSpinnersListeners () tepat setelah garis pembaruan. Ini akan mencegah onItemSelected dari menembak setelah pembaruan.
sumber
Kode
sumber
Bagi saya, solusi Abhi bekerja sangat baik hingga Api level 27.
Tetapi tampaknya dari Api level 28 ke atas, onItemSelected () tidak dipanggil ketika listener diatur, yang berarti onItemSelected () tidak pernah dipanggil.
Oleh karena itu, saya menambahkan pernyataan if pendek untuk memeriksa level Api:
Saya pikir itu cukup aneh dan saya tidak yakin apakah orang lain juga memiliki masalah ini, tetapi dalam kasus saya ini bekerja dengan baik.
sumber
Saya menempatkan TextView di atas Spinner, dengan ukuran dan latar belakang yang sama dengan Spinner, sehingga saya akan memiliki kontrol lebih besar atas seperti apa itu sebelum pengguna mengkliknya. Dengan TextView di sana, saya juga bisa menggunakan TextView untuk menandai ketika pengguna sudah mulai berinteraksi.
Kode Kotlin saya terlihat seperti ini:
File tata letak terlihat seperti ini, dengan bagian penting adalah Spinner dan TextView berbagi lebar, tinggi, dan margin yang sama:
Saya yakin solusi lain bekerja di mana Anda mengabaikan panggilan onItemSelected pertama, tapi saya benar-benar tidak menyukai gagasan untuk menganggapnya akan selalu dipanggil.
sumber