আমি কীভাবে আমার কাস্টম অবজেক্টগুলিকে পার্সেবল করতে পারি?


338

আমি আমার জিনিসগুলি পার্সেবল করার চেষ্টা করছি। তবে আমার কাছে কাস্টম অবজেক্ট রয়েছে এবং ArrayListসেগুলিতে আমার তৈরি অন্যান্য কাস্টম অবজেক্টগুলির বৈশিষ্ট্য রয়েছে।

এই কাজ করতে সবচেয়ে ভালো উপায় কি হতে পারে?

উত্তর:


431

আপনি এর কয়েকটি উদাহরণ এখানে , এখানে (কোডটি এখানে নেওয়া হয়েছে) এবং এখানে পেতে পারেন

আপনি এটির জন্য একটি 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প্রকারগুলি দেখায় । তবে আপনি যে কোনও ধরণের ডেটা পার্সেল করতে পারেন। চেষ্টা কর.

সম্পাদনা: রুকমাল ডায়াস প্রস্তাবিত আরেকটি উদাহরণ


@ রুকমাল ডায়াস 10x। আসলে, আমাকে অবশ্যই আমার উত্তরটি সম্পাদনা করতে হবে এবং কিছু কোড যুক্ত করতে হবে, কারণ এই লিঙ্কগুলি ভবিষ্যতে কোনও দিন আর সক্রিয় থাকবে না।
কথাসাহিত্য

16
কাস্টম অবজেক্টগুলিকে নিয়মিত স্ট্রিং নয় কীভাবে পাস করবেন জিজ্ঞাসা করে ওপি। যে কেউ নিয়মিত স্ট্রিংস পাস করতে পারেন। কাস্টম

আমি যদি কেবল লোকালড্রোডকাস্টম্যানেজার ব্যবহার করে প্রেরণ করি তবে আমাকে কি আসলে এনকোডিং / ডিকোডিং অংশগুলি বাস্তবায়ন করতে হবে? পার্সেবল বাস্তবায়ন এবং অতিরিক্ত হিসাবে রাখার পক্ষে কি যথেষ্ট?
জনিটেক্স

আপনি কেবল ধারাবাহিকভাবে স্ট্রিংগুলি লেখার পরিবর্তে একটি স্ট্রিং অ্যারে ব্যবহার করবেন না কেন?
কোয়ান্টিন রায়

writeToParcelপদ্ধতির অভ্যন্তরে স্ট্রিং অ্যারে তৈরি করার সময় কি সদস্যদের ক্রমটি বিবেচনা করে?
প্রখর মোহন শ্রীবাস্তব


113

ইন্টেলিজ আইডিইএ এবং অ্যান্ড্রয়েড স্টুডিওতে এর জন্য প্লাগইন রয়েছে:

এই প্লাগইনগুলি ক্লাসে ক্ষেত্রের ভিত্তিতে অ্যান্ড্রয়েড পার্সেলেবল বয়লারপ্লেট কোড উত্পন্ন করে।

প্লাগিন ডেমো


এই জিনিসগুলি করার নতুন পদ্ধতিতে টিআইএল করুন, দুর্দান্ত!
Sud007

56

1. আমদানি Android Parcelable code generator

এখানে চিত্র বর্ণনা লিখুন

2. একটি ক্লাস তৈরি করুন

public class Sample {
    int id;
    String name;
}

3. জেনারেট করুন> মেনু থেকে পার্সেবল

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

সম্পন্ন.


7
যারা ব্রাউজ সংগ্রহস্থলগুলি ডায়ালগটি রয়েছে তা জানেন না: File > Settings... > Pluginsএবং Browse repositories...বোতামটিতে ক্লিক করুন ।
দইদালুসআল্ফা

আপনাকে অনেক ধন্যবাদ!
স্ট্রাহিনজা আজভাজ

21

কিভাবে? টীকা সহ।

আপনি কেবলমাত্র একটি বিশেষ টীকা সহ একটি পজো টিকা দেন এবং বাকী পাঠাগারটি করে।

সতর্কবাণী!

আমি নিশ্চিত নই যে হরিজি, লম্বোক এবং অন্যান্য কোড প্রজন্মের গ্রন্থাগারগুলি অ্যান্ড্রয়েডের নতুন বিল্ড সিস্টেমের সাথে সামঞ্জস্যপূর্ণ। তারা গরম অদলবদল কোড (যেমন jRebel, তাত্ক্ষণিক চাল) দিয়ে খুব ভাল খেলতে পারে বা নাও পারে।

পেশাদাররা:

  • কোড জেনারেশন লাইব্রেরিগুলি আপনাকে বয়লারপ্লেট উত্স কোড থেকে সংরক্ষণ করে।
  • টীকাগুলি আপনার শ্রেণিকে সুন্দর করে তোলে।

কনস:

  • এটি সাধারণ ক্লাসগুলির জন্য ভাল কাজ করে। একটি জটিল শ্রেণীর পার্সেলেবল বানানো জটিল হতে পারে।
  • লম্বোক এবং অ্যাসপেক্টজে একসাথে ভাল খেলেন না। [বিস্তারিত]
  • আমার সতর্কতা দেখুন।

Hrisey

সতর্কবাণী!

হুসার জাভা 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তাদের মধ্যে নেই।

আপনার আইডিইয়ের জন্য - হুইসি জোর লম্বোক * - একটি প্লাগইন ইনস্টল করুন এবং এর আশ্চর্যজনক বৈশিষ্ট্যগুলি ব্যবহার শুরু করুন!

এখানে চিত্র বর্ণনা লিখুন
* হৃসি এবং লম্বোক প্লাগইন একসাথে সক্ষম করবেন না বা আইডিই লঞ্চের সময় আপনি একটি ত্রুটি পাবেন।


Parceler

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

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}"
}

PaperParcel

পেপারপ্যারসেল একটি এনোটেশন প্রসেসর যা স্বয়ংক্রিয়ভাবে কোটলিন এবং জাভার জন্য টাইপ-সেফ পার্সলেবল বয়লারপ্লেট কোড উত্পন্ন করে। পেপারপ্যারসেল একটি অটভ্যালু এক্সটেনশনের মাধ্যমে কোটলিন ডেটা ক্লাসগুলি, গুগলের অটোভ্যালু, বা কেবল নিয়মিত জাভা বিন বিন্যাসকে সমর্থন করে।

দস্তাবেজগুলির ব্যবহারের উদাহরণ । উদাহরণস্বরূপ একটি 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;
    }
}

কোটলিন ব্যবহারকারীদের জন্য, কোটলিন ব্যবহার দেখুন ; অটোভ্যালু ব্যবহারকারীদের জন্য অটোভ্যালু ব্যবহার দেখুন


ParcelableGenerator

পার্সেলেবল জেনারেটর (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;
    }

}

অ্যান্ড্রয়েড-কার্যক্ষম অ্যান্ড্রয়েড স্টুডিও সঙ্গে একযোগে টীকা প্রসেসর সঙ্গে কাজ করতে প্লাগইন সাহায্য করে।



1

এটি খুব সহজ, আপনি অ্যান্ড্রয়েড স্টুডিওতে প্লাগইন ব্যবহার করে অবজেক্টগুলিকে পার্সেবল করতে পারেন।

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];
    }
};}

4
আপনি কি প্লাগইন বলতে চাচ্ছেন?
naXa

0

এখন আপনি পার্সেলেলেবলিতে আপনার যে কোনও কাস্টম শ্রেণিকে রূপান্তর করতে পার্সেলার লাইব্রেরি ব্যবহার করতে পারেন । @ পার্সেল দিয়ে আপনার পোজো ক্লাসটি কেবল বর্ননা করুন । যেমন

    @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"));

0

অ্যান্ড্রয়েড পার্কেবল কিছু অনন্য জিনিস আছে। এগুলি বোকা দেওয়া হয়:

  1. আপনি পার্সেলটি একই ক্রম হিসাবে পড়তে হবে যেখানে আপনি পার্সেলে ডেটা রাখেন।
  2. পার্সেলটি পার্সেল থেকে পড়ার পরে খালি হবে। আপনার পার্সেলে যদি 3 টি ডেটা থাকে তবে তা That তারপরে 3 বার পড়ার পরে পার্সেল খালি থাকবে।

উদাহরণ: একটি ক্লাস পার্সেবল করতে এটি অবশ্যই পার্সেবল বাস্তবায়ন করতে হবে। পার্কেবলের 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 :)

0

অ্যান্ড্রয়েড স্টুডিওতে প্লাগইন ছাড়াই পার্সেবল ক্লাস তৈরি করুন

আপনার ক্লাসে পার্সলেবল প্রয়োগ করে এবং তারপরে "প্রয়োগগুলি পার্সেবল" তে কার্সার লাগান এবং হিট করে Alt+Enterনির্বাচন করুন Add Parcelable implementation(চিত্র দেখুন)। এটাই.

এখানে চিত্র বর্ণনা লিখুন


-3

করা: bundle.putSerializable("key",(Serializable) object);

পেতে: List<Object> obj = (List<Object>)((Serializable)bundle.getSerializable("key"));


3
ClassCastExceptionযদি বস্তুটি কার্যকর না করে তবে এটির দিকে পরিচালিত হবে Serializable
নেক্সা

1
যদিও এই কোড স্নিপেট একটি ব্যাখ্যা সহ প্রশ্নটি সমাধান করতে পারে, সত্যিই আপনার পোস্টের মান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না। আপনার কোডটি ব্যাখ্যামূলক মন্তব্যে ভিড় না করার চেষ্টা করুন, এটি কোড এবং ব্যাখ্যা উভয়ের পাঠযোগ্যতা হ্রাস করে!
আশীষ আহুজা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.