我试图使用持有意图的ClipData拖放对象。下面的代码在解组: BadParcelableException: nl.braaks55.parcelable.Card时给出了一个nl.braaks55.parcelable.Card:nl.braaks55.parcelable.Card。有人知道怎么解决这个问题吗?应该指定一个ClassLoader吗?
代码如下:
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);
}
}发布于 2018-05-11 21:34:43
是的,您应该指定类加载器。只需加一行:
Intent intent = item.getIntent();
intent.setExtrasClassLoader(Card.class.getClassLoader());
Card card = intent.getParcelableExtra("card");现在起作用了。
https://stackoverflow.com/questions/50280672
复制相似问题