Pernyataan kasus sakelar saya berfungsi dengan baik kemarin. Tetapi ketika saya menjalankan kode tadi pagi gerhana memberi saya kesalahan menggarisbawahi pernyataan kasus dalam warna merah dan mengatakan: ekspresi kasus harus ekspresi konstan, itu konstan saya tidak tahu apa yang terjadi. Ini kode saya di bawah ini:
public void onClick(View src)
{
switch(src.getId()) {
case R.id.playbtn:
checkwificonnection();
break;
case R.id.stopbtn:
Log.d(TAG, "onClick: stopping srvice");
Playbutton.setImageResource(R.drawable.playbtn1);
Playbutton.setVisibility(0); //visible
Stopbutton.setVisibility(4); //invisible
stopService(new Intent(RakistaRadio.this,myservice.class));
clearstatusbar();
timer.cancel();
Title.setText(" ");
Artist.setText(" ");
break;
case R.id.btnmenu:
openOptionsMenu();
break;
}
}
Semua R.id.int semuanya digarisbawahi dalam warna merah.
java
android
switch-statement
HeartlessArchangel
sumber
sumber
R.id.playbtn
dll? Apakah semuanya statis dan final?R
ini biasanya dihasilkan oleh alat IDE / dev, jadi biasanya benar untuk versi Android yang digunakan.Jawaban:
Dalam proyek Android biasa, konstanta dalam kelas R sumber daya dinyatakan seperti ini:
Namun, pada 14 ADT, dalam proyek perpustakaan, mereka akan dinyatakan seperti ini:
Dengan kata lain, konstanta tidak final dalam proyek perpustakaan. Karenanya kode Anda tidak lagi dapat dikompilasi.
Solusi untuk ini sederhana: Ubah pernyataan switch menjadi pernyataan if-else.
http://tools.android.com/tips/non-constant-fields
Anda dapat dengan cepat mengonversi
switch
pernyataan menjadiif-else
pernyataan menggunakan yang berikut ini:Di Eclipse
Pindahkan kursor Anda ke
switch
kata kunci dan tekan Ctrl+ 1lalu pilihDi Android Studio,
Pindahkan kursor Anda ke
switch
kata kunci dan tekan Alt+ Enterlalu pilihsumber
final
kata kunci, variabel dapat diubah saat runtime.Hapus centang "Apakah Perpustakaan" dalam proyek Properties bekerja untuk saya.
sumber
Solusi bisa dilakukan dengan cara ini:
Contoh:
Semoga ini bisa membantu Anda.
sumber
R.id. *, karena ADT 14 tidak lebih dideklarasikan sebagai final static int sehingga Anda tidak dapat menggunakan konstruksinya. Anda bisa menggunakan klausa lain jika bukan.
sumber
Solusi sederhana untuk masalah ini adalah:
Klik pada saklar dan kemudian tekan CTL + 1, Ini akan mengubah saklar Anda ke pernyataan blok if-else, dan akan menyelesaikan masalah Anda
sumber
Bagaimana dengan solusi lain ini untuk mempertahankan sakelar yang bagus alih-alih jika ada:
Jadi dalam kode Anda, Anda dapat melakukan ini:
Enum bersifat statis sehingga ini akan memiliki dampak yang sangat terbatas. Satu-satunya jendela yang perlu diperhatikan adalah pencarian ganda yang terlibat (pertama pada SparseArray internal dan kemudian pada tabel switch)
Yang mengatakan, enum ini juga dapat digunakan untuk mengambil item dengan lancar, jika diperlukan dengan menjaga referensi ke id ... tapi itu cerita untuk waktu lain.
sumber
Itu membuat saya kesalahan ini ketika saya menggunakan sakelar di fungsi dengan variabel yang dideklarasikan di kelas saya:
Masalahnya terpecahkan ketika saya mendeklarasikan
final
ke variabel di awal kelas:sumber
enum
adalah alternatif yang lebih baikint
dalam hal ini. Penelepon metode tidak akan dapat memanggil fungsi dengan tipe yang tidak valid.i have specific int types so its ok if i use ints
Tidak masuk akal. Mengenai contoh enum: docs.oracle.com/javase/tutorial/java/javaOO/enum.htmli mean that the incoming int variable type in the function will always be one of these 3 types so it won't break anything
Ini asumsi Anda . Orang lain dapat salah memanggil fungsi dengan nomor arbitrer. Denganenum
, Anda tidak perlu berasumsi, itu dipaksakan oleh bahasa.Saya ingin menyebutkan bahwa, saya menemukan situasi yang sama ketika saya mencoba menambahkan perpustakaan ke proyek saya. Tiba-tiba semua pernyataan beralih mulai menunjukkan kesalahan!
Sekarang saya mencoba untuk menghapus perpustakaan yang saya tambahkan, bahkan kemudian tidak berfungsi. bagaimana " ketika saya membersihkan proyek " semua kesalahan baru saja meledak!
sumber