首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除持有意图的ClipData将给BadParcelableException

删除持有意图的ClipData将给BadParcelableException
EN

Stack Overflow用户
提问于 2018-05-10 20:00:30
回答 1查看 115关注 0票数 1

我试图使用持有意图的ClipData拖放对象。下面的代码在解组: BadParcelableException: nl.braaks55.parcelable.Card时给出了一个nl.braaks55.parcelable.Card:nl.braaks55.parcelable.Card。有人知道怎么解决这个问题吗?应该指定一个ClassLoader吗?

代码如下:

代码语言:javascript
复制
dragButton.setOnLongClickListener(new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View view) {
            Intent intent = new Intent();
            intent.putExtra("card", new Card("Hearts", "Queen"));

            ClipData clipData = ClipData.newIntent("card", intent);
            View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder();

            view.startDrag(clipData, shadowBuilder, null, 0);

            return true;
        }
    });

    dropButton.setOnDragListener(new View.OnDragListener() {
        @Override
        public boolean onDrag(View view, DragEvent dragEvent) {
            switch (dragEvent.getAction()) {
                (...)
                case DragEvent.ACTION_DROP:
                    ClipData clipData = dragEvent.getClipData();
                    ClipData.Item item = clipData.getItemAt(0);
                    Intent intent = item.getIntent();
                    // The following line gives a BadParcelableException
                    Card card = intent.getParcelableExtra("card");
                    break;
            }

            return true;
        }
    });

public class Card implements Parcelable {
    private String color;
    private String rank;

    Card(String color, String rank) {
        this.color = color;
        this.rank = rank;
    }

    protected Card(Parcel in) {
        color = in.readString();
        rank = in.readString();
    }

    public static final Creator<Card> CREATOR = new Creator<Card>() {
        @Override
        public Card createFromParcel(Parcel in) {
            return new Card(in);
        }

        @Override
        public Card[] newArray(int size) {
            return new Card[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(color);
        dest.writeString(rank);
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-11 21:34:43

是的,您应该指定类加载器。只需加一行:

代码语言:javascript
复制
Intent intent = item.getIntent();
intent.setExtrasClassLoader(Card.class.getClassLoader());
Card card = intent.getParcelableExtra("card");

现在起作用了。

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

https://stackoverflow.com/questions/50280672

复制
相关文章

相似问题

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