Saya mencoba membuat benda saya Parcelable. Namun, saya memiliki objek khusus dan objek tersebut memiliki ArrayList
atribut objek khusus lain yang telah saya buat.
apa jalan terbaik melakukan ini?
Saya mencoba membuat benda saya Parcelable. Namun, saya memiliki objek khusus dan objek tersebut memiliki ArrayList
atribut objek khusus lain yang telah saya buat.
apa jalan terbaik melakukan ini?
Jawaban:
Anda dapat menemukan beberapa contohnya di sini , di sini (kode diambil di sini) , dan di sini .
Anda dapat membuat kelas POJO untuk ini, tetapi Anda perlu menambahkan beberapa kode tambahan untuk membuatnya Parcelable
. Lihatlah implementasinya.
public class Student implements Parcelable{
private String id;
private String name;
private String grade;
// Constructor
public Student(String id, String name, String grade){
this.id = id;
this.name = name;
this.grade = grade;
}
// Getter and setter methods
.........
.........
// Parcelling part
public Student(Parcel in){
String[] data = new String[3];
in.readStringArray(data);
// the order needs to be the same as in writeToParcel() method
this.id = data[0];
this.name = data[1];
this.grade = data[2];
}
@Оverride
public int describeContents(){
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeStringArray(new String[] {this.id,
this.name,
this.grade});
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public Student createFromParcel(Parcel in) {
return new Student(in);
}
public Student[] newArray(int size) {
return new Student[size];
}
};
}
Setelah Anda membuat kelas ini, Anda dapat dengan mudah melewatkan objek kelas ini melalui Intent
seperti ini, dan memulihkan objek ini di aktivitas target.
intent.putExtra("student", new Student("1","Mike","6"));
Di sini, siswa adalah kunci yang Anda perlukan untuk menghapus data dari bundel.
Bundle data = getIntent().getExtras();
Student student = (Student) data.getParcelable("student");
Contoh ini hanya menunjukkan String
tipe. Tapi, Anda bisa membagi data apa pun yang Anda inginkan. Cobalah.
EDIT: Contoh lain , disarankan oleh Rukmal Dias .
writeToParcel
metode penting?
Berikut adalah situs web untuk membuat Kelas Parcelable dari kelas buatan Anda:
IntelliJ IDEA dan Android Studio memiliki plugin untuk ini:
Plugin ini menghasilkan kode boilerplate Android Parcelable berdasarkan bidang di kelas.
Android Parcelable code generator
public class Sample {
int id;
String name;
}
File > Settings... > Plugins
dan klik Browse repositories...
tombol.
Anda cukup membubuhi keterangan POJO dengan anotasi khusus dan perpustakaan mengerjakan sisanya.
Peringatan!
Saya tidak yakin bahwa Hrisey, Lombok, dan perpustakaan pembuat kode lainnya kompatibel dengan sistem build baru Android. Mereka mungkin atau mungkin tidak bermain dengan baik dengan kode swapping panas (yaitu jRebel, Instant Run).
Pro:
Cons:
Peringatan!
Hrisey memiliki masalah yang diketahui dengan Java 8 dan karenanya tidak dapat digunakan untuk pengembangan Android saat ini. Lihat # 1 Tidak dapat menemukan kesalahan simbol (JDK 8) .
Hrisey berbasis di Lombok . Kelas parcelable menggunakan Hrisey :
@hrisey.Parcelable
public final class POJOClass implements android.os.Parcelable {
/* Fields, accessors, default constructor */
}
Sekarang Anda tidak perlu mengimplementasikan metode antarmuka Parcelable. Hrisey akan menghasilkan semua kode yang diperlukan selama fase preprocessing.
Hrisey dalam dependensi Gradle:
provided "pl.mg6.hrisey:hrisey:${hrisey.version}"
Lihat di sini untuk jenis yang didukung. ItuArrayList
antara mereka.
Instal sebuah plugin - Hrisey xor Lombok * - untuk IDE Anda dan mulai gunakan fitur-fiturnya yang menakjubkan!
* Jangan aktifkan plugin Hrisey dan Lombok bersama-sama atau Anda akan mendapatkan kesalahan saat peluncuran IDE.
Kelas parcelable menggunakan Parceler :
@java.org.parceler.Parcel
public class POJOClass {
/* Fields, accessors, default constructor */
}
Untuk menggunakan kode yang dihasilkan, Anda dapat mereferensikan kelas yang dihasilkan secara langsung, atau melalui Parcels
kelas utilitas menggunakan
public static <T> Parcelable wrap(T input);
Untuk referensi @Parcel
, panggil metode berikut Parcels
kelas
public static <T> T unwrap(Parcelable input);
Parceler dalam dependensi Gradle:
compile "org.parceler:parceler-api:${parceler.version}"
provided "org.parceler:parceler:${parceler.version}"
Lihat di README untuk tipe atribut yang didukung .
AutoParcel adalah AutoValue ekstensi yang memungkinkan nilai-nilai Parcelable generasi.
Cukup tambahkan implements Parcelable
ke @AutoValue
model beranotasi Anda :
@AutoValue
abstract class POJOClass implements Parcelable {
/* Note that the class is abstract */
/* Abstract fields, abstract accessors */
static POJOClass create(/*abstract fields*/) {
return new AutoValue_POJOClass(/*abstract fields*/);
}
}
AutoParcel dalam file build Gradle:
apply plugin: 'com.android.application'
apply plugin: 'com.neenbedankt.android-apt'
repositories {
/*...*/
maven {url "https://clojars.org/repo/"}
}
dependencies {
apt "frankiesardo:auto-parcel:${autoparcel.version}"
}
PaperParcel adalah prosesor anotasi yang secara otomatis menghasilkan kode boilerplate Parcelable aman untuk Kotlin dan Java. PaperParcel mendukung Kelas Data Kotlin, AutoValue Google melalui Ekstensi AutoValue, atau hanya objek kacang Java biasa.
Contoh penggunaan dari dokumen .
Beri anotasi kelas data Anda dengan @PaperParcel
, terapkan PaperParcelable
, dan tambahkan instance statis JVM dari PaperParcelable.Creator
mis:
@PaperParcel
public final class Example extends PaperParcelable {
public static final PaperParcelable.Creator<Example> CREATOR = new PaperParcelable.Creator<>(Example.class);
private final int test;
public Example(int test) {
this.test = test;
}
public int getTest() {
return test;
}
}
Untuk pengguna Kotlin, lihat Penggunaan Kotlin ; Untuk pengguna AutoValue, lihat Penggunaan AutoValue .
Generalener Parcelable (README ditulis dalam bahasa Cina dan saya tidak memahaminya. Kontribusi untuk jawaban ini dari pengembang berbahasa Inggris-Cina dipersilakan)
Contoh penggunaan dari README .
import com.baoyz.pg.Parcelable;
@Parcelable
public class User {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
The android-apt assist Plugin dalam bekerja dengan prosesor penjelasan dalam kombinasi dengan Android Studio.
Caranya sangat mudah, Anda bisa menggunakan plugin di android studio untuk membuat objek Parcelables.
public class Persona implements Parcelable {
String nombre;
int edad;
Date fechaNacimiento;
public Persona(String nombre, int edad, Date fechaNacimiento) {
this.nombre = nombre;
this.edad = edad;
this.fechaNacimiento = fechaNacimiento;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.nombre);
dest.writeInt(this.edad);
dest.writeLong(fechaNacimiento != null ? fechaNacimiento.getTime() : -1);
}
protected Persona(Parcel in) {
this.nombre = in.readString();
this.edad = in.readInt();
long tmpFechaNacimiento = in.readLong();
this.fechaNacimiento = tmpFechaNacimiento == -1 ? null : new Date(tmpFechaNacimiento);
}
public static final Parcelable.Creator<Persona> CREATOR = new Parcelable.Creator<Persona>() {
public Persona createFromParcel(Parcel source) {
return new Persona(source);
}
public Persona[] newArray(int size) {
return new Persona[size];
}
};}
Sekarang Anda dapat menggunakan pustaka Parceler untuk mengonversi kelas kustom apa pun Anda dalam parcelable. Beri catatan pada kelas POJO Anda dengan @Parcel . misalnya
@Parcel
public class Example {
String name;
int id;
public Example() {}
public Example(int id, String name) {
this.id = id;
this.name = name;
}
public String getName() { return name; }
public int getId() { return id; }
}
Anda dapat membuat objek kelas Contoh dan membungkus Paket dan mengirim sebagai bundel melalui niat. misalnya
Bundle bundle = new Bundle();
bundle.putParcelable("example", Parcels.wrap(example));
Sekarang untuk mendapatkan objek Kelas Kustom, gunakan saja
Example example = Parcels.unwrap(getIntent().getParcelableExtra("example"));
Android parcable memiliki beberapa hal unik. Itu diberikan di bawah ini:
Contoh: Untuk membuat kelas Parceble itu harus mengimplementasikan Parceble. Percable memiliki 2 metode:
int describeContents();
void writeToParcel(Parcel var1, int var2);
Misalkan Anda memiliki kelas Person dan memiliki 3 bidang, firstName, lastName dan umur. Setelah mengimplementasikan antarmuka Parceble. antarmuka ini diberikan di bawah ini:
import android.os.Parcel;
import android.os.Parcelable;
public class Person implements Parcelable{
private String firstName;
private String lastName;
private int age;
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getFirstName() {
return firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getLastName() {
return lastName;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(firstName);
parcel.writeString(lastName);
parcel.writeInt(age);
}
}
Di sini writeToParcel
metode kita menulis / menambahkan data pada Parcel dalam suatu pesanan. Setelah ini kita harus menambahkan kode di bawah ini untuk membaca data dari paket:
protected Person(Parcel in) {
firstName = in.readString();
lastName = in.readString();
age = in.readInt();
}
public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
Di sini, kelas Person mengambil paket dan mendapatkan data dalam urutan yang sama selama penulisan.
Sekarang selama niat getExtra
dan putExtra
kode diberikan di bawah ini:
Masukkan Ekstra :
Person person=new Person();
person.setFirstName("First");
person.setLastName("Name");
person.setAge(30);
Intent intent = new Intent(getApplicationContext(), SECOND_ACTIVITY.class);
intent.putExtra()
startActivity(intent);
Dapatkan Ekstra:
Person person=getIntent().getParcelableExtra("person");
Kelas Orang Penuh diberikan di bawah ini :
import android.os.Parcel;
import android.os.Parcelable;
public class Person implements Parcelable{
private String firstName;
private String lastName;
private int age;
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getFirstName() {
return firstName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getLastName() {
return lastName;
}
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(firstName);
parcel.writeString(lastName);
parcel.writeInt(age);
}
protected Person(Parcel in) {
firstName = in.readString();
lastName = in.readString();
age = in.readInt();
}
public static final Creator<Person> CREATOR = new Creator<Person>() {
@Override
public Person createFromParcel(Parcel in) {
return new Person(in);
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
}
Hope this will help you
Thanks :)
Buat kelas Parcelable tanpa plugin di Android Studio
mengimplementasikan Parcelable di kelas Anda dan kemudian meletakkan kursor pada "mengimplementasikan Parcelable" dan tekan Alt+Enter
dan pilih Add Parcelable implementation
(lihat gambar). itu dia.
Untuk menempatkan:
bundle.putSerializable("key",(Serializable) object);
Mendapatkan:
List<Object> obj = (List<Object>)((Serializable)bundle.getSerializable("key"));
ClassCastException
jika objek tidak diimplementasikan Serializable
.