Saya memiliki aktivitas yang ketika dimulai membutuhkan akses ke dua ArrayLists yang berbeda. Kedua Daftar adalah Objek berbeda yang telah saya buat sendiri.
Pada dasarnya saya butuh cara untuk meneruskan objek-objek ini ke aktivitas dari Intent. Saya dapat menggunakan addExtras () tetapi ini membutuhkan kelas Parceable yang kompatibel. Saya bisa membuat kelas saya menjadi serializable tetapi karena saya mengerti ini memperlambat program.
Apa saja pilihan saya?
Bisakah saya lulus Enum?
Sebagai tambahan: apakah ada cara untuk mengirimkan parameter ke Activity Constructor dari Intent?
Jawaban:
Ini adalah pertanyaan lama, tetapi semua orang gagal menyebutkan bahwa Enums sebenarnya
Serializable
dan karenanya dapat dengan sempurna ditambahkan ke Intent sebagai tambahan. Seperti ini:Saran untuk menggunakan variabel statis atau aplikasi-lebar adalah ide yang sangat buruk. Ini benar-benar pasangan kegiatan Anda ke sistem pengelolaan negara, dan sulit untuk mempertahankan, men-debug dan terikat masalah.
ALTERNATIF:
Poin yang baik dicatat oleh tedzyc tentang fakta bahwa solusi diberikan oleh Oderik memberi Anda kesalahan. Namun, alternatif yang ditawarkan agak rumit untuk digunakan (bahkan menggunakan obat generik).
Jika Anda benar-benar khawatir tentang kinerja menambahkan enum ke Intent, saya mengusulkan alternatif ini sebagai gantinya:
PILIHAN 1:
Pemakaian:
PILIHAN 2: (generik, dapat digunakan kembali, dan dipisahkan dari enum)
Pemakaian:
OPSI 3 (dengan Kotlin):
Sudah lama, tapi karena sekarang kita memiliki Kotlin, saya pikir saya akan menambahkan opsi lain untuk paradigma baru. Di sini kita dapat menggunakan fungsi ekstensi dan tipe reified (yang mempertahankan tipe ketika kompilasi).
Ada beberapa manfaat melakukannya dengan cara ini.
inline
yang akan menggantikan panggilan dengan kode di dalam fungsi.Salah satu kelemahannya adalah bahwa, jika kita mengubah urutan Emum, maka referensi lama mana pun tidak akan berfungsi. Ini bisa menjadi masalah dengan hal-hal seperti Maksud di dalam maksud yang tertunda karena mereka dapat bertahan dari pembaruan. Namun, untuk sisa waktu, itu harus ok.
Penting untuk dicatat bahwa solusi lain, seperti menggunakan nama alih-alih posisi, juga akan gagal jika kita mengganti nama salah satu nilai. Meskipun, dalam kasus tersebut, kami mendapatkan pengecualian alih-alih nilai Enum yang salah.
Pemakaian:
sumber
enum class
tipe ke Java biasaenum
. Saya kira solusi yang lebih mudah adalah dengan membuatenum class
implementSerializable
:enum class AwesomeEnum : Serializable { A, B, C }
Tidak ideal, tetapi harus bekerja.Anda dapat membuat enum mengimplementasikan Parcelable yang cukup mudah untuk enum:
Anda kemudian dapat menggunakan Intent.putExtra (String, Parcelable).
UPDATE: Harap perhatikan komentar wreckgar itu
enum.values()
mengalokasikan array baru di setiap panggilan.PEMBARUAN: Android Studio menampilkan templat langsung
ParcelableEnum
yang mengimplementasikan solusi ini. (Di Windows, gunakan Ctrl+ J)sumber
Anda dapat melewatkan enum sebagai string.
String yang diberikan didukung Anda harus dapat melewati nilai enum sekitar tanpa masalah.
sumber
Untuk melewatkan enum dengan niat, Anda dapat mengubah enum menjadi integer.
Ex:
Mengirim (enum ke integer):
Menerima (integer ke enum):
Salam Hormat. :)
sumber
Jika Anda benar-benar perlu, Anda bisa membuat serial enum sebagai String, menggunakan
name()
danvalueOf(String)
, sebagai berikut:Ini jelas tidak berfungsi jika enum Anda memiliki keadaan yang bisa berubah (yang seharusnya tidak, benar-benar).
sumber
Dimungkinkan untuk membuat Enum Anda mengimplementasikan Serializable maka Anda dapat meneruskannya melalui Intent, karena ada metode untuk meneruskannya sebagai serializable. Saran untuk menggunakan int bukan enum adalah palsu. Enum digunakan untuk membuat kode Anda lebih mudah dibaca dan lebih mudah dipelihara. Ini akan menjadi langkah besar mundur ke zaman kegelapan untuk tidak dapat menggunakan Enums.
sumber
tentang pos Oderik:
Jika Anda mendefinisikan variabel MyEnum, myEnum, maka lakukan intent.putExtra ("Parcelable1", myEnum), Anda akan mendapatkan "Metode putExtra (String, Parcelable) ambigu untuk pesan kesalahan tipe Intent". karena ada juga metode Intent.putExtra (String, Parcelable), dan tipe 'Enum' asli itu sendiri mengimplementasikan antarmuka Serializable, jadi kompiler tidak tahu memilih metode mana (intent.putExtra (String, Parcelable / atau Serializable)).
Sarankan agar menghapus antarmuka Parcelable dari MyEnum, dan pindahkan kode inti ke implementasi wrapcel 'Parcelable class, seperti ini (Father2 adalah Parcelable dan berisi bidang enum):
maka kita bisa melakukan:
sumber
intent.putExtra("myEnum", (Parcelable) enumValue);
bundle.putExtra("key", AnotherEnum.X.ordinal())
.Anda dapat menggunakan enum konstruktor agar enum memiliki tipe data primitif ..
Anda dapat menggunakan pass int sebagai ekstra lalu tarik dari enum menggunakan nilainya.
sumber
Sebagian besar jawaban yang menggunakan konsep Parcelable di sini adalah dalam kode Java. Lebih mudah melakukannya di Kotlin.
Beri catatan pada kelas enum Anda dengan @Parcelize dan terapkan antarmuka Parcelable.
sumber
Saya suka yang sederhana.
HAPPY
danSAD
.IntentFactory
yang membuat AndaIntent
untuk Anda. Lewati ituMode
Anda inginkan.IntentFactory
menggunakan namaMode
kelas sebagai nama ekstra.IntentFactory
bertobat yangMode
keString
menggunakanname()
onCreate
gunakan info ini untuk mengkonversi kembali ke aMode
.Anda bisa menggunakan
ordinal()
danMode.values()
juga. Saya suka string karena saya bisa melihatnya di debugger.sumber
Saya pikir taruhan terbaik Anda adalah mengubah daftar itu menjadi sesuatu yang tak terpisahkan seperti string (atau peta?) Untuk mendapatkannya ke dalam Kegiatan. Maka Kegiatan harus mengubahnya kembali menjadi sebuah array.
Menerapkan parcelables khusus adalah rasa sakit di IMHO IMHO jadi saya akan menghindarinya jika memungkinkan.
sumber
Pertimbangkan Mengikuti enum ::
Untuk Passing ::
Untuk mengambil kembali dari maksud / bundel / argumen ::
sumber
Jika Anda hanya ingin mengirim enum, Anda dapat melakukan sesuatu seperti:
Pertama mendeklarasikan enum yang mengandung beberapa nilai (yang dapat dilewatkan melalui niat):
Kemudian:
Dan ketika Anda ingin mendapatkannya:
Sepotong kue!
sumber
Gunakan Fungsi Ekstensi Kotlin
Ini memberi Anda fleksibilitas untuk melewati beberapa jenis enum yang sama, atau default untuk menggunakan nama kelas.
sumber
Jangan gunakan enum. Alasan # 78 untuk tidak menggunakan enum. :) Gunakan bilangan bulat, yang dapat dengan mudah dikirim ulang melalui Bundle dan Parcelable.
sumber
mEnum.ordinal()
? itu mengembalikan posisi elemenEnum.ordinal()
tetap pada waktu kompilasi. Satu-satunya waktu yang berlaku komentar akan melewati data antara aplikasi dengan versi enum yang berbeda, atau lintas pembaruan aplikasi yang mengubah urutan elemen dalam enum. Hal semacam itu berbahaya setiap kali Anda menggunakan sesuatu yang bukan primitif. Untuk melewati maksud antara aktivitas dalam satu aplikasi,Enum.ordinal()
harus sepenuhnya aman.