I Have found many places where they send an ArrayList but I need to be able to send a simple Array of my custom object "Card" from activity A to B. I beleive I have made the classes in a way that will allow my Object to be passed as an extra from an Intent. This is my Parcelable class Card:
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];
}
};
}
and this is how I am adding it to the intent in the activity A (e.i. the main activity):
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);
I am then retriving it in Activity B's onCreate method as so:
allCards = (Card[]) getIntent().getExtras().getParcelableArray("array");
unfourntunatley the app is crashing as soon as it reaches the code in Activity B. Am I calling it the wrong way? Here is the 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
You can pass an ArrayList<E> the same way, if the E type is Serializable . You would call the putExtra (String name, Serializable value) of Intent to store, and getSerializableExtra (String name) for retrieval. Save this answer.
Passing Array To The Method In Java To pass an array as an argument to a method, you just have to pass the name of the array without square brackets. The method prototype should match to accept the argument of the array type. Given below is the method prototype: void method_name (int [] array);
Syntax: Class_Name obj[ ]= new Class_Name[Array_Length]; For example, if you have a class Student, and we want to declare and instantiate an array of Student objects with two objects/object references then it will be written as: Student[ ] studentObjects = new Student[2];
putExtra() : This method sends the data to another activity and in parameter, we have to pass key-value pair. Add the below code in onClick() method. intent. putExtra("full_name", fullName);
You can't cast arrays like that. If you have an array of Parcelable
and you want to cast it to an array of Card
, you need to loop through the array and cast each object separately:
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];
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With