我找到了许多发送ArrayList的地方,但我需要能够将自定义对象“Card”的简单数组从活动A发送到B.我相信我已经以允许的方式创建了类我的对象将作为Intent的额外传递。这是我的Parcelable类卡:
import android.os.Parcel;
import android.os.Parcelable;
public class Card implements Parcelable{
public String suit;
public int value;
public String color;
public Card(String suit, int value){
this.suit = suit;
this.value = value;
if(suit == "hearts" || suit == "diamonds"){
this.color = "red";
}else{
this.color = "black";
}
}
public String toString(){
String s = suit;
return s;
}
private Card(Parcel in) {
value = in.readInt();
color = in.readString();
suit = in.readString();
}
public int describeContents() {
return 0;
}
public void writeToParcel(Parcel out, int flags) {
out.writeInt(value);
out.writeString(color);
out.writeString(suit);
}
public static final Parcelable.Creator<Card> CREATOR
= new Parcelable.Creator<Card>() {
public Card createFromParcel(Parcel in) {
return new Card(in);
}
public Card[] newArray(int size) {
return new Card[size];
}
};
}
这就是我如何将它添加到活动A中的意图(e.i.主要活动):
Card[] myCardArray = new Card[7];
//Note the card array is filled before starting the intent.
Intent intnt = new Intent(this, B.class);
intnt.putExtra("array", myCardArray);
startActivity(intnt);
然后我在Activity B的onCreate方法中将其重新启动,如下所示:
allCards = (Card[]) getIntent().getExtras().getParcelableArray("array");
unourntunatley应用程序一旦到达活动B中的代码就会崩溃。我是以错误的方式调用它吗? 这是logcat
09-05 15:27:37.007: E/Trace(26971): error opening trace file: No such file or directory (2)
09-05 15:27:37.007: D/ActivityThread(26971): setTargetHeapUtilization:0.25
09-05 15:27:37.007: D/ActivityThread(26971): setTargetHeapIdealFree:8388608
09-05 15:27:37.007: D/ActivityThread(26971): setTargetHeapConcurrentStart:2097152
09-05 15:27:37.228: D/libEGL(26971): loaded /system/lib/egl/libEGL_adreno200.so
09-05 15:27:37.228: D/libEGL(26971): loaded /system/lib/egl/libGLESv1_CM_adreno200.so
09-05 15:27:37.228: D/libEGL(26971): loaded /system/lib/egl/libGLESv2_adreno200.so
09-05 15:27:37.248: I/Adreno200-EGLSUB(26971): <ConfigWindowMatch:2087>: Format RGBA_8888.
09-05 15:27:37.268: E/(26971): <s3dReadConfigFile:75>: Can't open file for reading
09-05 15:27:37.268: E/(26971): <s3dReadConfigFile:75>: Can't open file for reading
09-05 15:27:37.268: D/OpenGLRenderer(26971): Enabling debug mode 0
09-05 15:27:39.640: I/Adreno200-EGLSUB(26971): <ConfigWindowMatch:2087>: Format RGBA_8888.
09-05 15:27:41.963: I/Adreno200-EGLSUB(26971): <ConfigWindowMatch:2087>: Format RGBA_8888.
09-05 15:27:42.844: I/Adreno200-EGLSUB(26971): <ConfigWindowMatch:2087>: Format RGBA_8888.
09-05 15:27:44.425: I/Adreno200-EGLSUB(26971): <ConfigWindowMatch:2087>: Format RGBA_8888.
09-05 15:27:46.257: I/Adreno200-EGLSUB(26971): <ConfigWindowMatch:2087>: Format RGBA_8888.
09-05 15:27:47.799: I/Adreno200-EGLSUB(26971): <ConfigWindowMatch:2087>: Format RGBA_8888.
09-05 15:27:49.781: I/Adreno200-EGLSUB(26971): <ConfigWindowMatch:2087>: Format RGBA_8888.
09-05 15:27:51.182: I/Adreno200-EGLSUB(26971): <ConfigWindowMatch:2087>: Format RGBA_8888.
09-05 15:27:51.943: I/Adreno200-EGLSUB(26971): <ConfigWindowMatch:2087>: Format RGBA_8888.
09-05 15:27:55.237: I/Adreno200-EGLSUB(26971): <ConfigWindowMatch:2087>: Format RGBA_8888.
09-05 15:27:56.468: I/Adreno200-EGLSUB(26971): <ConfigWindowMatch:2087>: Format RGBA_8888.
09-05 15:27:57.910: I/Adreno200-EGLSUB(26971): <ConfigWindowMatch:2087>: Format RGBA_8888.
09-05 15:27:59.101: D/AndroidRuntime(26971): Shutting down VM
09-05 15:27:59.101: W/dalvikvm(26971): threadid=1: thread exiting with uncaught exception (group=0x412e8438)
09-05 15:27:59.111: E/AndroidRuntime(26971): FATAL EXCEPTION: main
09-05 15:27:59.111: E/AndroidRuntime(26971): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.marco.pokerhands2/com.marco.pokerhands2.DisplayHands}: java.lang.ClassCastException: android.os.Parcelable[] cannot be cast to com.marco.pokerhands2.Card[]
09-05 15:27:59.111: E/AndroidRuntime(26971): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2088)
09-05 15:27:59.111: E/AndroidRuntime(26971): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2113)
09-05 15:27:59.111: E/AndroidRuntime(26971): at android.app.ActivityThread.access$700(ActivityThread.java:139)
09-05 15:27:59.111: E/AndroidRuntime(26971): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1224)
09-05 15:27:59.111: E/AndroidRuntime(26971): at android.os.Handler.dispatchMessage(Handler.java:99)
09-05 15:27:59.111: E/AndroidRuntime(26971): at android.os.Looper.loop(Looper.java:137)
09-05 15:27:59.111: E/AndroidRuntime(26971): at android.app.ActivityThread.main(ActivityThread.java:4918)
09-05 15:27:59.111: E/AndroidRuntime(26971): at java.lang.reflect.Method.invokeNative(Native Method)
09-05 15:27:59.111: E/AndroidRuntime(26971): at java.lang.reflect.Method.invoke(Method.java:511)
09-05 15:27:59.111: E/AndroidRuntime(26971): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004)
09-05 15:27:59.111: E/AndroidRuntime(26971): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771)
09-05 15:27:59.111: E/AndroidRuntime(26971): at dalvik.system.NativeStart.main(Native Method)
09-05 15:27:59.111: E/AndroidRuntime(26971): Caused by: java.lang.ClassCastException: android.os.Parcelable[] cannot be cast to com.marco.pokerhands2.Card[]
09-05 15:27:59.111: E/AndroidRuntime(26971): at com.marco.pokerhands2.DisplayHands.onCreate(DisplayHands.java:30)
09-05 15:27:59.111: E/AndroidRuntime(26971): at android.app.Activity.performCreate(Activity.java:5048)
09-05 15:27:59.111: E/AndroidRuntime(26971): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
09-05 15:27:59.111: E/AndroidRuntime(26971): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2052)
09-05 15:27:59.111: E/AndroidRuntime(26971): ... 11 more
答案 0 :(得分:22)
你不能像这样投射数组。如果你有一个Parcelable
数组,并且你想将它转换为Card
数组,你需要遍历数组并分别转换每个对象:
Parcelable[] allParcelables = getIntent().getExtras().getParcelableArray("array");
Card[] allCards = new Card[allParcelables.length];
for (int i = 0 ; i < allParcelables.length; i++) {
allCards[i] = (Card)allParcelables[i];
}
答案 1 :(得分:0)
我的解决方案是:
allCards = in.createTypedArray(Card.CREATOR);