मैं अपनी वस्तुओं को पार्सल करने की कोशिश कर रहा हूं। हालाँकि, मेरे पास कस्टम ऑब्जेक्ट्स हैं और उन ऑब्जेक्ट्स में ArrayList
मेरे द्वारा बनाई गई अन्य कस्टम ऑब्जेक्ट्स की विशेषताएँ हैं।
क्या सबसे अच्छा तरीका होगा यह करने का?
मैं अपनी वस्तुओं को पार्सल करने की कोशिश कर रहा हूं। हालाँकि, मेरे पास कस्टम ऑब्जेक्ट्स हैं और उन ऑब्जेक्ट्स में ArrayList
मेरे द्वारा बनाई गई अन्य कस्टम ऑब्जेक्ट्स की विशेषताएँ हैं।
क्या सबसे अच्छा तरीका होगा यह करने का?
जवाबों:
आप इसके कुछ उदाहरण यहाँ , (यहाँ कोड लिया गया है) और यहाँ देख सकते हैं ।
आप इसके लिए एक POJO क्लास बना सकते हैं, लेकिन इसे बनाने के लिए आपको कुछ अतिरिक्त कोड जोड़ना होगा Parcelable
। कार्यान्वयन पर एक नजर है।
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];
}
};
}
एक बार जब आप इस वर्ग को बना लेते हैं, तो आप इस Intent
तरह की वस्तुओं को आसानी से इस तरह से पास कर सकते हैं , और लक्ष्य गतिविधि में इस ऑब्जेक्ट को पुनर्प्राप्त कर सकते हैं ।
intent.putExtra("student", new Student("1","Mike","6"));
यहां, छात्र वह कुंजी है जिसे आपको बंडल से डेटा को अनइंस्टॉल करने की आवश्यकता होगी।
Bundle data = getIntent().getExtras();
Student student = (Student) data.getParcelable("student");
यह उदाहरण केवल String
प्रकार दिखाता है । लेकिन, आप किसी भी तरह का डेटा पार्सल कर सकते हैं। कोशिश करके देखो।
EDIT: रुक्मल डायस द्वारा सुझाया गया एक और उदाहरण ।
writeToParcel
विधि के मामले के अंदर स्ट्रिंग सरणी बनाते समय सदस्यों का क्रम क्या है?
अपनी बनाई कक्षा से एक Parcelable Class बनाने के लिए यहाँ एक वेबसाइट है:
IntelliJ IDEA और Android Studio के पास इसके लिए प्लग इन हैं:
ये प्लगइन्स क्लास में फ़ील्ड के आधार पर एंड्रॉइड पार्सलेबल बॉयलरप्लेट कोड उत्पन्न करते हैं।
Android Parcelable code generator
public class Sample {
int id;
String name;
}
File > Settings... > Plugins
और Browse repositories...
बटन पर क्लिक करें।
आप बस एक विशेष एनोटेशन के साथ एक POJO एनोटेट करते हैं और लाइब्रेरी बाकी काम करता है।
चेतावनी!
मुझे यकीन नहीं है कि एंड्रॉइड के नए बिल्ड सिस्टम के साथ हैरिस, लोम्बोक और अन्य कोड जनरेशन लाइब्रेरी संगत हैं। वे हॉट स्वैपिंग कोड (यानी jRebel, इंस्टेंट रन) के साथ अच्छी तरह से खेल सकते हैं या नहीं।
पेशेवरों:
विपक्ष:
चेतावनी!
Hrisey का जावा 8 के साथ एक ज्ञात मुद्दा है और इसलिए इसे आजकल Android विकास के लिए उपयोग नहीं किया जा सकता है। देखें # 1 प्रतीक त्रुटियों को नहीं पा सकता (JDK 8) ।
Hrisey पर आधारित है लंबोक । Parcelable वर्ग का उपयोग कर Hrisey :
@hrisey.Parcelable
public final class POJOClass implements android.os.Parcelable {
/* Fields, accessors, default constructor */
}
अब आपको पार्सलेबल इंटरफ़ेस के किसी भी तरीके को लागू करने की आवश्यकता नहीं है। ह्रीसे प्रीप्रोसेसिंग चरण के दौरान सभी आवश्यक कोड उत्पन्न करेगा।
ग्रैडल निर्भरता में हैरिस:
provided "pl.mg6.hrisey:hrisey:${hrisey.version}"
समर्थित प्रकारों के लिए यहां देखें । ArrayList
उन के बीच में है।
अपनी IDE के लिए एक प्लगइन - Hrisey xor लंबोक * स्थापित करें और इसकी अद्भुत विशेषताओं का उपयोग शुरू करें!
* Hrisey और Lombok प्लगइन्स को एक साथ सक्षम न करें या आपको IDE लॉन्च के दौरान कोई त्रुटि मिलेगी।
Parcelable वर्ग का उपयोग कर Parceler :
@java.org.parceler.Parcel
public class POJOClass {
/* Fields, accessors, default constructor */
}
उत्पन्न कोड का उपयोग करने के लिए, आप सीधे उत्पन्न वर्ग का संदर्भ ले सकते हैं, या Parcels
उपयोगिता वर्ग का उपयोग कर सकते हैं
public static <T> Parcelable wrap(T input);
के संदर्भ में @Parcel
, Parcels
कक्षा की निम्नलिखित विधि को कहें
public static <T> T unwrap(Parcelable input);
ग्रेडल निर्भरताओं में पार्सलर:
compile "org.parceler:parceler-api:${parceler.version}"
provided "org.parceler:parceler:${parceler.version}"
समर्थित विशेषता प्रकारों के लिए README में देखें ।
AutoParcel एक AutoValue एक्सटेंशन है जो Parcelable values जनरेशन को सक्षम करता है।
बस implements Parcelable
अपने @AutoValue
एनोटेट मॉडल में जोड़ें :
@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:
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}"
}
पेपरपर्ल एक एनोटेशन प्रोसेसर है जो स्वचालित रूप से कोटलिन और जावा के लिए टाइप-सेफ पार्सलेबल बॉयलरप्लेट कोड बनाता है। पेपरपर्ल, कोटलिन डेटा क्लासेस, गूगल के ऑटोवैल्यू को एक ऑटोवैल्यू एक्सटेंशन या सिर्फ नियमित जावा बीन ऑब्जेक्ट के माध्यम से समर्थन करता है।
डॉक्स से उदाहरण का उपयोग करें । उदाहरण के लिए, JVM स्थिर उदाहरण के
साथ अपने डेटा वर्ग को एनोटेट करें @PaperParcel
, कार्यान्वित करें PaperParcelable
और जोड़ें PaperParcelable.Creator
:
@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;
}
}
कोटलिन उपयोगकर्ताओं के लिए, कोटलिन उपयोग देखें ; AutoValue उपयोगकर्ताओं के लिए, AutoValue उपयोग देखें ।
ParcelableGenerator (README चीनी में लिखा गया है और मुझे यह समझ में नहीं आता है। अंग्रेजी-चीनी भाषी डेवलपर्स के इस उत्तर में योगदान का स्वागत है)
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;
}
}
Android-उपयुक्त एंड्रॉयड स्टूडियो के साथ संयोजन में एनोटेशन प्रोसेसर के साथ काम करने में सहायता करता है प्लगइन।
यह बहुत आसान है, आप ऑब्जेक्ट पार्सलबेल बनाने के लिए एंड्रॉइड स्टूडियो पर एक प्लगइन का उपयोग कर सकते हैं।
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];
}
};}
अब आप अपने किसी भी कस्टम वर्ग को पार्सल में बदलने के लिए पार्सलर लाइब्रेरी का उपयोग कर सकते हैं । बस अपने POJO वर्ग को @ पार्सल के साथ एनोटेट करें । जैसे
@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; }
}
आप उदाहरण वर्ग की एक वस्तु बना सकते हैं और पार्सल के माध्यम से लपेट सकते हैं और इरादे के माध्यम से एक बंडल के रूप में भेज सकते हैं। जैसे
Bundle bundle = new Bundle();
bundle.putParcelable("example", Parcels.wrap(example));
अब कस्टम क्लास ऑब्जेक्ट का उपयोग करने के लिए
Example example = Parcels.unwrap(getIntent().getParcelableExtra("example"));
एंड्रॉइड पार्सबल में कुछ अनोखी चीजें हैं। उन लोगों को दिया जाता है:
उदाहरण: एक वर्ग Parceble बनाने के लिए Parceble को लागू करना चाहिए। Percable में 2 विधि है:
int describeContents();
void writeToParcel(Parcel var1, int var2);
मान लीजिए कि आपके पास एक व्यक्ति वर्ग है और इसके 3 क्षेत्र हैं, पहला नाम, अंतिम नाम और आयु। Parceble इंटरफ़ेस को लागू करने के बाद। इस इंटरफ़ेस को bellow दिया गया है:
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);
}
}
यहां writeToParcel
हम एक क्रम में पार्सल पर डेटा लिख / जोड़ रहे हैं। इसके बाद हमें पार्सल से डेटा पढ़ने के लिए bellow कोड जोड़ना होगा:
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];
}
};
यहां, व्यक्ति वर्ग पार्सल ले रहा है और लेखन के दौरान उसी क्रम में डेटा प्राप्त कर रहा है।
अब इरादे getExtra
और putExtra
कोड के दौरान bellow दिया गया है:
अतिरिक्त में रखो :
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);
अतिरिक्त प्राप्त करें:
Person person=getIntent().getParcelableExtra("person");
पूर्ण व्यक्ति वर्ग को दिया जाता है :
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 :)
एंड्रॉइड स्टूडियो में प्लगइन के बिना पार्सलेबल क्लास बनाएं
अपनी कक्षा में पार्सेलेबल लागू करता है और फिर "इम्प्लीमेंट्स पार्सलेबल" पर कर्सर रखता है और हिट Alt+Enter
और सेलेक्ट Add Parcelable implementation
(चित्र देखें) करता है। बस।
रखना:
bundle.putSerializable("key",(Serializable) object);
लेना:
List<Object> obj = (List<Object>)((Serializable)bundle.getSerializable("key"));
ClassCastException
जब ऑब्जेक्ट लागू नहीं होता है Serializable
।