Staram się, aby moje przedmioty można było nadawać na działce. Mam jednak obiekty niestandardowe, które mają ArrayList
atrybuty innych obiektów niestandardowych, które utworzyłem.
Jaki byłby najlepszy sposób to zrobić?
źródło
Staram się, aby moje przedmioty można było nadawać na działce. Mam jednak obiekty niestandardowe, które mają ArrayList
atrybuty innych obiektów niestandardowych, które utworzyłem.
Jaki byłby najlepszy sposób to zrobić?
Przykłady tego można znaleźć tutaj , tutaj (kod jest pobierany tutaj) i tutaj .
Możesz do tego utworzyć klasę POJO, ale musisz dodać dodatkowy kod, aby to zrobić Parcelable
. Zobacz implementację.
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];
}
};
}
Po utworzeniu tej klasy możesz łatwo przepuścić obiekty tej klasy przez Intent
podobne i odzyskać ten obiekt w działaniu docelowym.
intent.putExtra("student", new Student("1","Mike","6"));
Tutaj uczeń jest kluczem, którego potrzebujesz, aby rozpakować dane z pakietu.
Bundle data = getIntent().getExtras();
Student student = (Student) data.getParcelable("student");
Ten przykład pokazuje tylko String
typy. Możesz jednak spakować dowolne dane. Wypróbuj to.
EDYCJA: Kolejny przykład , sugerowany przez Rukmal Dias .
writeToParcel
metody ma znaczenie?Oto strona internetowa, na której można utworzyć klasę działkową z utworzonej przez siebie klasy:
http://www.parcelabler.com/
źródło
IntelliJ IDEA i Android Studio mają wtyczki do tego:
Wtyczki te generują kod paczkowany Androida na podstawie pól w klasie.
źródło
1. Importuj
Android Parcelable code generator
2. Utwórz klasę
3. Wygeneruj> Paczkowany z menu
Gotowy.
źródło
File > Settings... > Plugins
i kliknijBrowse repositories...
przycisk.W jaki sposób? Z adnotacjami.
Po prostu adnotujesz POJO specjalną adnotacją, a biblioteka zajmie się resztą.
Plusy:
Cons:
Hrisey
Hrisey opiera się na Lombok . Klasa działki przy użyciu Hrisey :
Teraz nie musisz wdrażać żadnych metod interfejsu Parcelable. Hrisey wygeneruje cały wymagany kod podczas fazy wstępnego przetwarzania.
Hrisey w zależnościach Gradle:
Zobacz tutaj obsługiwane typy.
ArrayList
Jest wśród nich.Zainstaluj wtyczkę - Hrisey xor Lombok * - dla swojego IDE i zacznij korzystać z jej niesamowitych funkcji!
* Nie włączaj wtyczek Hrisey i Lombok razem, bo pojawi się błąd podczas uruchamiania IDE.
Paczka
Klasa paczki za pomocą Parceler :
Aby użyć wygenerowanego kodu, możesz odwoływać się do wygenerowanej klasy bezpośrednio lub za pomocą
Parcels
klasy narzędzi, używającAby wyłuskać
@Parcel
, po prostu wywołaj następującą metodęParcels
klasyDziałka w zależnościach Gradle:
Poszukaj w README obsługiwanych typów atrybutów .
AutoParcel
AutoParcel to AutoValue rozszerzenie które umożliwia generowanie wartości Parcelable.
Po prostu dodaj
implements Parcelable
do swoich@AutoValue
modeli z adnotacjami:AutoParcel w pliku kompilacji Gradle:
PaperParcel
PaperParcel to procesor adnotacji, który automatycznie generuje bezpieczny kod paczkowany dla Kotlin i Java. PaperParcel obsługuje Klasy danych Kotlin, AutoValue Google'a poprzez rozszerzenie AutoValue lub zwykłe obiekty Java Bean.
Przykład użycia z dokumentów .
Dodaj adnotację do swojej klasy danych
@PaperParcel
, zaimplementujPaperParcelable
i dodaj instancję statyczną JVM,PaperParcelable.Creator
np .:Dla użytkowników Kotlin, patrz Wykorzystanie Kotlin ; Dla użytkowników AutoValue, zobacz Korzystanie z AutoValue .
ParcelableGenerator
ParcelableGenerator (README jest napisane po chińsku i nie rozumiem tego. Mile widziane są wkłady w tę odpowiedź od twórców anglojęzycznych)
Przykład użycia z README .
W android-apt asysty plugin w pracy z procesorami adnotacji w połączeniu z systemem Android Studio.
źródło
Znalazłem najprostszy sposób na stworzenie klasy Parcelable
źródło
To bardzo proste, możesz użyć wtyczki na Android Studio, aby tworzyć obiekty Paczkowate.
źródło
Teraz możesz użyć biblioteki Parceler do konwersji dowolnej niestandardowej klasy na paczkową. Dodaj adnotację do swojej klasy POJO za pomocą @Parcel . na przykład
możesz utworzyć obiekt klasy Przykład i owinąć Paczki i wysłać jako pakiet przez zamiar. na przykład
Teraz, aby uzyskać obiekt klasy niestandardowej, wystarczy użyć
źródło
Paczka z Androidem ma kilka unikalnych cech. Poniżej podano:
Przykład: aby stworzyć klasę Parceble, należy zaimplementować Parceble. Percable ma 2 metody:
Załóżmy, że masz klasę Person, która ma 3 pola: FirstName, LastName i wiek. Po wdrożeniu interfejsu Parceble. ten interfejs podano poniżej:
W tej
writeToParcel
metodzie piszemy / dodajemy dane na Paczce w zamówieniu. Następnie musimy dodać poniższy kod do odczytu danych z paczki:Tutaj klasa Person bierze paczkę i pobiera dane w tej samej kolejności podczas pisania.
Teraz podczas intencji
getExtra
iputExtra
kodu podano poniżej:Dodaj dodatkowe :
Uzyskaj dodatkowe:
Klasa Full Person znajduje się poniżej :
źródło
Utwórz klasę działki bez wtyczki w Android Studio
implementuje Parcelable w twojej klasie, a następnie umieść kursor na „implements Parcelable” i naciśnij
Alt+Enter
i wybierzAdd Parcelable implementation
(patrz zdjęcie). Otóż to.źródło
Położyć:
bundle.putSerializable("key",(Serializable) object);
Aby uzyskać:
List<Object> obj = (List<Object>)((Serializable)bundle.getSerializable("key"));
źródło
ClassCastException
jeśli obiekt nie zaimplementujeSerializable
.