আমি আমার জিনিসগুলি পার্সেবল করার চেষ্টা করছি। তবে আমার কাছে কাস্টম অবজেক্ট রয়েছে এবং 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
প্রকারগুলি দেখায় । তবে আপনি যে কোনও ধরণের ডেটা পার্সেল করতে পারেন। চেষ্টা কর.
সম্পাদনা: রুকমাল ডায়াস প্রস্তাবিত আরেকটি উদাহরণ ।
writeToParcel
পদ্ধতির অভ্যন্তরে স্ট্রিং অ্যারে তৈরি করার সময় কি সদস্যদের ক্রমটি বিবেচনা করে?
আপনার তৈরি ক্লাস থেকে পার্সেবল ক্লাস তৈরি করতে এখানে একটি ওয়েবসাইট রয়েছে:
ইন্টেলিজ আইডিইএ এবং অ্যান্ড্রয়েড স্টুডিওতে এর জন্য প্লাগইন রয়েছে:
এই প্লাগইনগুলি ক্লাসে ক্ষেত্রের ভিত্তিতে অ্যান্ড্রয়েড পার্সেলেবল বয়লারপ্লেট কোড উত্পন্ন করে।
Android Parcelable code generator
public class Sample {
int id;
String name;
}
File > Settings... > Plugins
এবং Browse repositories...
বোতামটিতে ক্লিক করুন ।
আপনি কেবলমাত্র একটি বিশেষ টীকা সহ একটি পজো টিকা দেন এবং বাকী পাঠাগারটি করে।
সতর্কবাণী!
আমি নিশ্চিত নই যে হরিজি, লম্বোক এবং অন্যান্য কোড প্রজন্মের গ্রন্থাগারগুলি অ্যান্ড্রয়েডের নতুন বিল্ড সিস্টেমের সাথে সামঞ্জস্যপূর্ণ। তারা গরম অদলবদল কোড (যেমন jRebel, তাত্ক্ষণিক চাল) দিয়ে খুব ভাল খেলতে পারে বা নাও পারে।
পেশাদাররা:
কনস:
সতর্কবাণী!
হুসার জাভা 8 নিয়ে একটি পরিচিত সমস্যা রয়েছে এবং তাই আজকাল অ্যান্ড্রয়েড বিকাশের জন্য এটি ব্যবহার করা যায় না। # 1 দেখুন প্রতীক ত্রুটিগুলি খুঁজে পাওয়া যায় না (জেডিকে 8) ।
হৃজি লম্বোকের উপর ভিত্তি করে তৈরি । Parcelable বর্গ ব্যবহার Hrisey :
@hrisey.Parcelable
public final class POJOClass implements android.os.Parcelable {
/* Fields, accessors, default constructor */
}
এখন আপনাকে পার্সেবল ইন্টারফেসের কোনও পদ্ধতি প্রয়োগ করতে হবে না। প্রিপ্রোসেসিং পর্বে হরিসি সমস্ত প্রয়োজনীয় কোড উত্পন্ন করবে।
গ্রেডল নির্ভরতাগুলিতে হরি:
provided "pl.mg6.hrisey:hrisey:${hrisey.version}"
সমর্থিত প্রকারের জন্য এখানে দেখুন । ArrayList
তাদের মধ্যে নেই।
আপনার আইডিইয়ের জন্য - হুইসি জোর লম্বোক * - একটি প্লাগইন ইনস্টল করুন এবং এর আশ্চর্যজনক বৈশিষ্ট্যগুলি ব্যবহার শুরু করুন!
* হৃসি এবং লম্বোক প্লাগইন একসাথে সক্ষম করবেন না বা আইডিই লঞ্চের সময় আপনি একটি ত্রুটি পাবেন।
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 একটি হল স্বয়ংক্রিয়-মান এক্সটেনশন Parcelable মান প্রজন্মের দেয়।
কেবলমাত্র 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*/);
}
}
গ্রেডল বিল্ড ফাইলটিতে অটোপার্সেল:
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;
}
}
কোটলিন ব্যবহারকারীদের জন্য, কোটলিন ব্যবহার দেখুন ; অটোভ্যালু ব্যবহারকারীদের জন্য অটোভ্যালু ব্যবহার দেখুন ।
পার্সেলেবল জেনারেটর (README চীনা ভাষায় রচিত এবং আমি এটি বুঝতে পারি না english
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;
}
}
অ্যান্ড্রয়েড-কার্যক্ষম অ্যান্ড্রয়েড স্টুডিও সঙ্গে একযোগে টীকা প্রসেসর সঙ্গে কাজ করতে প্লাগইন সাহায্য করে।
এটি খুব সহজ, আপনি অ্যান্ড্রয়েড স্টুডিওতে প্লাগইন ব্যবহার করে অবজেক্টগুলিকে পার্সেবল করতে পারেন।
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];
}
};}
এখন আপনি পার্সেলেলেবলিতে আপনার যে কোনও কাস্টম শ্রেণিকে রূপান্তর করতে পার্সেলার লাইব্রেরি ব্যবহার করতে পারেন । @ পার্সেল দিয়ে আপনার পোজো ক্লাসটি কেবল বর্ননা করুন । যেমন
@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"));
অ্যান্ড্রয়েড পার্কেবল কিছু অনন্য জিনিস আছে। এগুলি বোকা দেওয়া হয়:
উদাহরণ: একটি ক্লাস পার্সেবল করতে এটি অবশ্যই পার্সেবল বাস্তবায়ন করতে হবে। পার্কেবলের 2 টি পদ্ধতি রয়েছে:
int describeContents();
void writeToParcel(Parcel var1, int var2);
মনে করুন আপনার একটি ব্যক্তি শ্রেণি রয়েছে এবং এটির 3 টি ক্ষেত্র, ফার্স্টনাম, লাস্টনাম এবং বয়স রয়েছে। পার্সেবল ইন্টারফেস প্রয়োগ করার পরে। এই ইন্টারফেসটি নীচে দেওয়া হয়:
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
পদ্ধতিটি আমরা একটি ক্রমে পার্সলে ডেটা লিখছি / যুক্ত করছি। এর পরে পার্সেল থেকে ডেটা পড়ার জন্য আমাদের বেলো কোড যুক্ত করতে হবে:
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
কোডের সময় নমুনা দেওয়া হয়:
অতিরিক্ত রাখুন :
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
।