Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you send an Array of custom objects between activities?

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
like image 587
user2748360 Avatar asked Sep 04 '13 20:09

user2748360


People also ask

How can we send ArrayList from one activity to another activity?

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.

How do you send an array of objects in Java?

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);

How do you create an array of objects in another class?

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];

How can we pass data from one activity to another using Android intent?

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);


1 Answers

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];
}
like image 105
David Wasser Avatar answered Nov 10 '22 22:11

David Wasser