2

I have two activity (A and B). Activity A launches Activity B using startActivityForResult.

From Activity B, for coming back in the Activity A I used the following code:

ArrayList<Articles> selectedArticlesList =null;
...
Intent data = new Intent();
Bundle bundle = new Bundle();  
bundle.putParcelableArrayList("selected-articles", selectedArticlesList);
data.putExtras(bundle);
setResult(RESULT_OK, data);
finish();

where the class Articles implements Parcelable class.

The Activity A overrides the method onActivityResult:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if(data.hasExtra("selected-articles")){
         dettServiziListCorrente = new ArrayList<Articles>();
         dettServiziListCorrente  = data.getExtras().getParcelableArrayList("selected-articles");  
         Articles a = dettServiziListCorrente.get(0);
         Log.i("PRINT DESCRIPTION MEMBER", String.valueOf(a.description));
    }
}

I obtain the following error:

09-11 17:29:24.020: E/AndroidRuntime(21499): FATAL EXCEPTION: main
09-11 17:29:24.020: E/AndroidRuntime(21499): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=-1, data=Intent { (has extras) }} to activity {host.activity/host.activity.ActivityA}: java.lang.RuntimeException: bad array lengths
09-11 17:29:24.020: E/AndroidRuntime(21499):    at android.app.ActivityThread.deliverResults(ActivityThread.java:2980)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3023)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at android.app.ActivityThread.access$1100(ActivityThread.java:123)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1177)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at android.os.Handler.dispatchMessage(Handler.java:99)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at android.os.Looper.loop(Looper.java:137)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at android.app.ActivityThread.main(ActivityThread.java:4424)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at java.lang.reflect.Method.invokeNative(Native Method)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at java.lang.reflect.Method.invoke(Method.java:511)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at dalvik.system.NativeStart.main(Native Method)
09-11 17:29:24.020: E/AndroidRuntime(21499): Caused by: java.lang.RuntimeException: bad array lengths
09-11 17:29:24.020: E/AndroidRuntime(21499):    at android.os.Parcel.readStringArray(Parcel.java:838)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at host.framework.component.Articles.<init>(Articles.java:30)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at host.framework.component.Articles$1.createFromParcel(Articles.java:56)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at host.framework.component.Articles$1.createFromParcel(Articles.java:1)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at android.os.Parcel.readParcelable(Parcel.java:1992)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at android.os.Parcel.readValue(Parcel.java:1854)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at android.os.Parcel.readListInternal(Parcel.java:2103)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at android.os.Parcel.readArrayList(Parcel.java:1544)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at android.os.Parcel.readValue(Parcel.java:1875)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at android.os.Parcel.readMapInternal(Parcel.java:2094)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at android.os.Bundle.unparcel(Bundle.java:223)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at android.os.Bundle.containsKey(Bundle.java:264)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at android.content.Intent.hasExtra(Intent.java:3754)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at host.activity.ACT_CreazioneOrdine.onActivityResult(ACT_CreazioneOrdine.java:192)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at android.app.Activity.dispatchActivityResult(Activity.java:4649)
09-11 17:29:24.020: E/AndroidRuntime(21499):    at android.app.ActivityThread.deliverResults(ActivityThread.java:2976)
09-11 17:29:24.020: E/AndroidRuntime(21499):    ... 11 more

My implementation of Articles class is:

public class Articles implements Parcelable{

    public int id;
    public String description;
    public String immagine;
    public int quantita;

    public Articles (int id,String descriprion, String immagine){
        this.id = id;
        this.description = descriprion;
        this.immagine = immagine;   
        this.quantita = 0;
    }

    public Articles (int id,String descriprion, String immagine,int quantita){
        this.id = id;
        this.description = descriprion;
        this.immagine = immagine;   
        this.quantita = quantita;
    }

    public Articles (Parcel in){
        String[] data = new String[3];

        in.readStringArray(data);
        this.id = Integer.parseInt(data[0]);
        this.description = data[1];
        this.immagine = data[2];
        this.quantita = Integer.parseInt(data[3]);
    }

    @Override
    public int describeContents() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        // TODO Auto-generated method stub
        dest.writeStringArray(new String[] {
                String.valueOf(this.id),
                this.description,
                this.immagine,
                String.valueOf(this.quantita)
            });
    }

    public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
        public Articles createFromParcel(Parcel in) {
            return new Articles (in); 
        }

        public Articles [] newArray(int size) {
            return new Articles [size];
        }
    };
     }
2
  • Have you tried to pass array instead of list? Commented Sep 11, 2013 at 16:16
  • Thank you for suggestione @Roberto, but putParcelableArrayList is exactly for passing ArrayList Commented Sep 11, 2013 at 17:04

1 Answer 1

4

the problem is in this function:

public Articles (Parcel in)
{
       String[] data = new String[3];// here you defined array of 3 elements it should be 4
       in.readStringArray(data);
       this.id = Integer.parseInt(data[0]);
       this.description = data[1];
       this.immagine = data[2];
       this.quantita = Integer.parseInt(data[3]);
}

because in this line you are passing four elements:

dest.writeStringArray(new String[]
    { String.valueOf(this.id), this.description, this.immagine, String.valueOf(this.quantita) });
Sign up to request clarification or add additional context in comments.

1 Comment

you are right! I added a new member in the class and I forgot to change the array size!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.