Parcelable의 하위 클래스를 다른 Parcel에 작성
Parcelable
인터페이스 를 구현하는 클래스가 있습니다.
class A implements Parcelable {
}
인스턴스 변수로 개체 B
를 포함하는 다른 클래스 가 있습니다 A
. 에서 writeToPacel
내부 클래스 B
, 나는 개체를 작성 비용 B
받는 사람 Parcel
:
class B implements Parcelable{
public void writeToParcel(Parcel dest, int flags) {
dest.write ???
}
}
어떻게 쓰고 있습니까?
class B implements Parcelable{
//lets assume you have A as a data member
A obj;
public void writeToParcel(Parcel dest, int flags) {
dest.writeParcelable(obj , flags);
}
}
당신이 그것을 사용하십시오
obj = in.readParcelable(A.class.getClassLoader());
반사를 피하는이를 처리하는 더 좋은 방법은 다음과 같이 대상 유형에서 정적 작성자를 호출하는 것입니다.
this.amazingObject = AmazingObject.CREATOR.createFromParcel(in);
Parcelable
사용하여 작성하십시오.this.amazingObject.writeToParcel(Parcel, int)
내부적으로 호출 readParcelable(ClassLoader)
하면 다음이 발생합니다.
public final <T extends Parcelable> T readParcelable(ClassLoader loader) {
Parcelable.Creator<T> creator = readParcelableCreator(loader);
if (creator == null) {
return null;
}
if (creator instanceof Parcelable.ClassLoaderCreator<?>) {
return ((Parcelable.ClassLoaderCreator<T>)creator).createFromParcel(this, loader);
}
return creator.createFromParcel(this);
}
보시 다시피이 메소드의 마지막 호출은 오른쪽을 호출하는 Creator
것이지만 내부 readParcelableCreator
에는 직접 호출하여 피할 수있는 많은 것이 있습니다.
이 유틸리티 호출은 유용 할 수 있습니다.
import android.os.Parcel;
import android.os.Parcelable;
public class Parcels {
public static void writeBoolean(Parcel dest, Boolean value) {
dest.writeByte((byte) (value != null && value ? 1 : 0));
}
public static Boolean readBoolean(Parcel in){
return in.readByte() != 0;
}
public static void writeParcelable(Parcel dest, int flags, Parcelable parcelable) {
writeBoolean(dest, parcelable == null);
if (parcelable != null) {
parcelable.writeToParcel(dest, flags);
}
}
public static <T extends Parcelable> T readParcelable(Parcel in, Parcelable.Creator<T> creator) {
boolean isNull = readBoolean(in);
return isNull ? null : creator.createFromParcel(in);
}
}
라인 :
obj = (A)in.readParcelable(A.class.getClassLoader());
다음으로 변경해야합니다.
obj = (A)in.readParcelable(B.class.getClassLoader());
동일한 문제가 발생하여 여러 Google 검색, 많은 웹 페이지 또는 자습서에서 우리 A.class.getClassLoader()
가 A로 캐스팅하기 때문에 사용하도록 제안 했지만 실제로는 null 값을 얻을 B.class.getClassLoader()
것이기 때문에 codes are INSIDE class B
. 왜 그런지 몰랐지만 이런 식으로 올바른 A 객체를 얻을 수 있습니다.
의견 및 확인에 오신 것을 환영합니다 !!
참고 URL : https://stackoverflow.com/questions/12239343/write-a-sub-class-of-parcelable-to-another-parcel
'ProgramingTip' 카테고리의 다른 글
IF가 IF-ELSE보다 더 잘 검증 되었습니까? (0) | 2020.11.16 |
---|---|
어떤 것이 더 빠르고 더 낫입니까? (0) | 2020.11.16 |
도구를 투명하게 만드는 방법은 무엇입니까? (0) | 2020.11.16 |
mysql에서 SET autocommit = 1과 START TRANSACTION의 차이점 (내가 놓친 위치?) (0) | 2020.11.15 |
모바일 장치의 Twitter 부트 신뢰할 수있는 모달 (0) | 2020.11.15 |