首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将Parcelable的子类写入另一个Parcel

将Parcelable的子类写入另一个Parcel
EN

Stack Overflow用户
提问于 2012-09-03 04:05:38
回答 3查看 35.8K关注 0票数 68

我有一个实现Parcelable接口的类:

代码语言:javascript
运行
复制
class A implements Parcelable {

}

我还有另一个类B,它包含一个A对象作为实例变量。在writeToPacel内部的类B中,我希望将对象B写入Parcel

代码语言:javascript
运行
复制
class B implements Parcelable{

    public void writeToParcel(Parcel dest, int flags) {
        dest.write ??? 
    }
}

我怎么写和读它呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-03 04:37:48

代码语言:javascript
运行
复制
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);

    }
}

如果你想阅读它,可以使用这个

代码语言:javascript
运行
复制
 obj = in.readParcelable(A.class.getClassLoader());
票数 171
EN

Stack Overflow用户

发布于 2014-09-15 23:47:32

避免反射的一种更好的处理方法是简单地在目标类型中调用静态创建器,如下所示:

代码语言:javascript
运行
复制
this.amazingObject = AmazingObject.CREATOR.createFromParcel(in);

并使用this.amazingObject.writeToParcel(Parcel, int)将其写入Parcelable

在内部,当调用readParcelable(ClassLoader)时会发生这种情况:

代码语言:javascript
运行
复制
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内部,我们可以通过直接调用它来避免大量的反射。

此实用程序调用可能很有用:

代码语言:javascript
运行
复制
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);
    }

}
票数 11
EN

Stack Overflow用户

发布于 2014-02-07 14:01:41

这行代码:

代码语言:javascript
运行
复制
obj = (A)in.readParcelable(A.class.getClassLoader());

应更改为:

代码语言:javascript
运行
复制
obj = (A)in.readParcelable(B.class.getClassLoader());

我遇到了同样的问题,并做了几个谷歌搜索,许多网页或教程建议我们使用A.class.getClassLoader(),因为我们是转换为A,但实际上它是错误的,因为你会得到一个空值,我们必须使用B.class.getClassLoader(),因为codes are INSIDE class B。我只是不知道为什么,但它可以通过这种方式获得正确的A对象。

欢迎评论和验证!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12239343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档