Ich versuche, meine Objekte paketfähig zu machen. Ich habe jedoch benutzerdefinierte Objekte und diese Objekte haben ArrayList
Attribute anderer benutzerdefinierter Objekte, die ich erstellt habe.
Was wäre der beste Weg, dies zu tun?
quelle
Ich versuche, meine Objekte paketfähig zu machen. Ich habe jedoch benutzerdefinierte Objekte und diese Objekte haben ArrayList
Attribute anderer benutzerdefinierter Objekte, die ich erstellt habe.
Was wäre der beste Weg, dies zu tun?
Einige Beispiele hierfür finden Sie hier , hier (Code wird hier verwendet) und hier .
Sie können hierfür eine POJO-Klasse erstellen, müssen jedoch zusätzlichen Code hinzufügen, um dies zu erreichen Parcelable
. Schauen Sie sich die Implementierung an.
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];
}
};
}
Sobald Sie diese Klasse erstellt haben, können Sie Objekte dieser Klasse auf einfache Weise Intent
wie folgt übergeben und dieses Objekt in der Zielaktivität wiederherstellen.
intent.putExtra("student", new Student("1","Mike","6"));
Hier ist der Schüler der Schlüssel, den Sie benötigen würden, um die Daten aus dem Bundle zu entfernen.
Bundle data = getIntent().getExtras();
Student student = (Student) data.getParcelable("student");
Dieses Beispiel zeigt nur String
Typen. Sie können jedoch jede Art von Daten paketieren, die Sie möchten. Versuch es.
EDIT: Ein weiteres Beispiel , vorgeschlagen von Rukmal Dias .
writeToParcel
Methode von Bedeutung?Hier ist eine Website zum Erstellen einer Paketklasse aus Ihrer erstellten Klasse:
http://www.parcelabler.com/
quelle
IntelliJ IDEA und Android Studio haben Plugins dafür:
Diese Plugins generieren den Code für Android Parcelable- Boilerplates basierend auf Feldern in der Klasse.
quelle
1. Importieren
Android Parcelable code generator
2. Erstellen Sie eine Klasse
3. Generieren> Paketieren aus dem Menü
Erledigt.
quelle
File > Settings... > Plugins
und auf dieBrowse repositories...
Schaltfläche klicken .Wie? Mit Anmerkungen.
Sie kommentieren einfach ein POJO mit einer speziellen Anmerkung und die Bibliothek erledigt den Rest.
Vorteile:
Nachteile:
Hrisey
Hrisey basiert auf Lombok . Paketklasse mit Hrisey :
Jetzt müssen Sie keine Methoden der Parcelable-Schnittstelle implementieren. Hrisey generiert während der Vorverarbeitungsphase den gesamten erforderlichen Code.
Hrisey in Gradle-Abhängigkeiten:
Hier finden Sie unterstützte Typen. Das
ArrayList
ist unter ihnen.Installieren Sie ein Plugin - Hrisey xor Lombok * - für Ihre IDE und nutzen Sie die erstaunlichen Funktionen!
* Aktivieren Sie die Hrisey- und Lombok-Plugins nicht zusammen, da sonst beim Start der IDE eine Fehlermeldung angezeigt wird.
Paketierer
Paketklasse mit Parceler :
Um den generierten Code zu verwenden, können Sie direkt oder über die
Parcels
Utility-Klasse mit auf die generierte Klasse verweisenUm die dereferenzieren zu können
@Parcel
, rufen Sie einfach die folgendeParcels
Klassenmethode aufParceler in Gradle-Abhängigkeiten:
Suchen Sie in README nach unterstützten Attributtypen .
AutoParcel
AutoParcel ist eine AutoValue- Erweiterung, die die Generierung von Paketwerten ermöglicht.
Fügen
implements Parcelable
Sie einfach Ihren@AutoValue
kommentierten Modellen hinzu:AutoParcel in Gradle-Build-Datei:
PaperParcel
PaperParcel ist ein Annotationsprozessor, der automatisch typsicheren Parcelable Boilerplate-Code für Kotlin und Java generiert. PaperParcel unterstützt Kotlin-Datenklassen, Googles AutoValue über eine AutoValue-Erweiterung oder nur normale Java-Bean-Objekte.
Verwendungsbeispiel aus Dokumenten .
Anmerken Ihre Datenklasse mit
@PaperParcel
, implementierenPaperParcelable
, und fügen Sie eine JVM statische Instanz vonPaperParcelable.Creator
zB:Informationen zu Kotlin-Benutzern finden Sie unter Kotlin-Verwendung . Informationen zu AutoValue-Benutzern finden Sie unter AutoValue-Verwendung .
ParcelableGenerator
ParcelableGenerator (README ist auf Chinesisch geschrieben und ich verstehe es nicht. Beiträge zu dieser Antwort von englisch-chinesisch sprechenden Entwicklern sind willkommen.)
Anwendungsbeispiel aus README .
Das android-apt Plugin unterstützt Sie bei der Arbeit mit Anmerkungsprozessoren in Kombination mit Android Studio.
quelle
Ich habe den einfachsten Weg gefunden, eine Paketklasse zu erstellen
quelle
Es ist sehr einfach, Sie können ein Plugin auf Android Studio verwenden, um Objekte Parcelables zu machen.
quelle
Jetzt können Sie die Parceler- Bibliothek verwenden, um Ihre benutzerdefinierte Klasse in Parcelable zu konvertieren. Kommentieren Sie einfach Ihre POJO-Klasse mit @Parcel . z.B
Sie können ein Objekt der Beispielklasse erstellen, Pakete umbrechen und durch Absicht als Bundle senden. z.B
Um nun ein benutzerdefiniertes Klassenobjekt zu erhalten, verwenden Sie einfach
quelle
Android Parcable hat einige einzigartige Dinge. Diese sind unten angegeben:
Beispiel: Um eine Klasse Parceble zu erstellen, muss Parceble implementiert werden. Percable hat 2 Methoden:
Angenommen, Sie haben eine Personenklasse mit drei Feldern: Vorname, Nachname und Alter. Nach der Implementierung der Parceble-Schnittstelle. Diese Schnittstelle ist unten angegeben:
Hier
writeToParcel
schreiben / fügen wir Daten auf Paket in einer Bestellung hinzu. Danach müssen wir folgenden Code zum Lesen von Daten aus dem Paket hinzufügen:Hier nimmt die Personenklasse ein Paket entgegen und erhält während des Schreibens Daten in derselben Reihenfolge.
Jetzt wird während der Absicht
getExtra
und desputExtra
Codes unten angegeben:Extra hinzufügen :
Holen Sie sich extra:
Die vollständige Personenklasse wird unten angegeben :
quelle
Erstellen Sie eine Paketklasse ohne Plugin in Android Studio
implementiert Parcelable in Ihrer Klasse und setzt dann den Cursor auf "implementiert Parcelable" und drückt
Alt+Enter
und wähltAdd Parcelable implementation
(siehe Bild). das ist es.quelle
Stellen:
bundle.putSerializable("key",(Serializable) object);
Bekommen:
List<Object> obj = (List<Object>)((Serializable)bundle.getSerializable("key"));
quelle
ClassCastException
dass das Objekt nicht implementiert wirdSerializable
.