Android:Parcel: unable to marshal value - android

I am getting below error while passing custom Arraylist in intent.
Parcel: unable to marshal value com.kahoindia.dev.models.KaHOStudentModel#62bceea
This is how am passing
KaHOSelectedObj selObject = new KaHOSelectedObj(); /*Parcelable */
selObject.setmIntent(mContext);
selObject.setSelectedStudents(mSelectedStudents);
Intent intent = new Intent(mContext, KaHOMyInputsActivity.class);
Bundle bundle = new Bundle();
bundle.putParcelable("SelectedStudents", selObject);
intent.putExtras(bundle);
startActivity(intent);
I am using Parcelable, but am getting unable to marshall.. run time error in the calling function at line start activity. Please help how to proceed with!
public class KaHOSelectedObj implements Parcelable
{
private Context mIntent;
private ArrayList<KaHOStudentModel> mSelectedStudentObj;
public Context getmIntent() {
return mIntent;
}
public void setmIntent(Context mIntent) {
this.mIntent = mIntent;
}
public ArrayList<KaHOStudentModel> getSelectedStudents() {
return mSelectedStudentObj;
}
public void setSelectedStudents(ArrayList<KaHOStudentModel> mObjects) {
this.mSelectedStudentObj = mObjects;
}
public static final Parcelable.Creator<KaHOSelectedObj> CREATOR = new Creator<KaHOSelectedObj>() {
#Override
public KaHOSelectedObj createFromParcel(Parcel source) {
KaHOSelectedObj selObj = new KaHOSelectedObj();
selObj.mSelectedStudentObj = source.readArrayList(null);
return selObj;
}
#Override
public KaHOSelectedObj[] newArray(int size) {
return new KaHOSelectedObj[size];
}
};
#Override
public int describeContents() {
return 0;
}
#Override
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeList(mSelectedStudentObj);
}
}

Related

How to populate values to variables of a parcelable class whose object we are sending from one activity to the other

Stack trace:
11-16 20:39:42.374 30640-30703/? E/LocalFingerprints: cannot compute fingerprint for: content://media/external/images/media/41373
java.io.FileNotFoundException: No such file or directory
at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:146)
at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:682)
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1063)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:904)
at android.content.ContentResolver.openInputStream(ContentResolver.java:629)
at cak.a(PG:159)
at bzj.a(PG:123)
at com.google.android.apps.plus.service.FingerprintScannerIntentService.onHandleIntent(PG:79)
at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.os.HandlerThread.run(HandlerThread.java:61)
This is the FirstActivity:
void handleBlogEditClick(){
if (BlogDetailActivity.this!= null) {
BlogDetailVO blogDetailVO=new BlogDetailVO(getArgs().getmId(),getArgs().getmName().toString(),getArgs().getmDescription().toString());
blogDetailVO.mCoverPic.setmImageUrl(getArgs().getmImageUrl());
Intent intent = new Intent(BlogDetailActivity.this, EditBlogActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
intent.putExtra("blogDetailVO",blogDetailVO);
startActivity(intent);
}
}
Second activity:
mState = new EditBlogState();
Intent intent = getIntent();
BlogDetailVO blogDetailVO =(BlogDetailVO) intent.getParcelableExtra("blogDetailVO");
mState.mCoverPhotoStory.setmName(blogDetailVO.getmName());
mView.updateBlogTitle(mState.mCoverPhotoStory.getmName());
Other things in the first and second activity code is irrelevant to this so i shared this much
public class BlogDetailVO extends BlogFeedVO implements Parcelable{
PhotoStoryVO mCoverPic;
List<PhotoStoryVO> mPhotoStories;
LocationVO mLocationVO;
public BlogDetailVO(String mId, String mName, String mDescription) {
super(mId, mName, mDescription);
}
protected BlogDetailVO(Parcel in) {
super(in);
mCoverPic = in.readParcelable(PhotoStoryVO.class.getClassLoader());
mPhotoStories = in.createTypedArrayList(PhotoStoryVO.CREATOR);
mLocationVO = in.readParcelable(LocationVO.class.getClassLoader());
}
#Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeParcelable(mCoverPic, flags);
dest.writeTypedList(mPhotoStories);
dest.writeParcelable(mLocationVO, flags);
}
#Override
public int describeContents() {
return hashCode();
}
public static final Creator<BlogDetailVO> CREATOR = new Creator<BlogDetailVO>() {
#Override
public BlogDetailVO createFromParcel(Parcel in) {
return new BlogDetailVO(in);
}
#Override
public BlogDetailVO[] newArray(int size) {
return new BlogDetailVO[size];
}
};
public PhotoStoryVO getmCoverPic() {
return mCoverPic;
}
public void setmCoverPic(PhotoStoryVO mCoverPic) {
this.mCoverPic = mCoverPic;
}
public List<PhotoStoryVO> getmPhotoStories() {
return mPhotoStories;
}
public void setmPhotoStories(List<PhotoStoryVO> mPhotoStories) {
this.mPhotoStories = mPhotoStories;
}
public LocationVO getmLocationVO() {
return mLocationVO;
}
public void setmLocationVO(LocationVO mLocationVO) {
this.mLocationVO = mLocationVO;
}
}
I am new to android. so sorry if the question is silly. But i am really stuck and need help. i am sending BlogDetailVO class object to another activity. The second line is showing null. so can't i populate value in this way? Eventually it crashes.
BlogDetailVO blogDetailVO=new BlogDetailVO(getArgs().getmId(),getArgs().getmName().toString(),getArgs().getmDescription().toString());
blogDetailVO.mCoverPic.setmImageUrl(getArgs().getmImageUrl()); //this gives the error!!
Intent intent = new Intent(BlogDetailActivity.this, EditBlogActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
intent.putExtra("blogDetailVO",blogDetailVO); startActivity(intent);
So how to populate values to BlogDtailVO class so to send it to the other activity?
In the receiving activity I am receiving it this way:
Intent intent = getIntent();
BlogDetailVO blogDetailVO =(BlogDetailVO) intent.getParcelableExtra("blogDetailVO");

How to pass a Parcelable Extra to another activity

I'm trying to pass a Parceble Extra to another activity using this example, but when I try get it on my second activity NullPointerExeception shows up, could somebody help me?
My Parcelable class:
public class MetaDados implements Parcelable {
private int codigoInstituicao;
// . . .
public MetaDados(int codigoInstituicao, int ano, String offlineUuid, String sigla, String nameInst,
String startedDate, String name, String finishedDate, long size) {
this.codigoInstituicao = codigoInstituicao;
// . . .
}
public int getCodigoInstituicao() {
return codigoInstituicao;
}
public void setCodigoInstituicao(int codigoInstituicao) {
this.codigoInstituicao = codigoInstituicao;
}
//getters and setters . . .
#Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
#Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(codigoInstituicao);
// . . .
}
public static final Parcelable.Creator<MetaDados> CREATOR = new Parcelable.Creator<MetaDados>() {
public MetaDados createFromParcel(Parcel in) {
return new MetaDados(in);
}
public MetaDados[] newArray(int size) {
return new MetaDados[size];
}
};
private MetaDados(Parcel in) {
codigoInstituicao = in.readInt();
//. . .
}
}
My AsynkTask how start my other activity:
ArrayList<MetaDados> metaDadosFull = new ArrayList<MetaDados>();
ArrayList<MetaDados> metaDadosPres = new ArrayList<MetaDados>();
Intent it = new Intent(activity, DownloadSelectionActivity.class);
it.putExtra("metaDadosFull", metaDadosFull);
it.putExtra("metaDadosPres", metaDadosPres);
activity.startActivity(it);
And my DownloadSelectionActivity where I try to get it:
ArrayList<MetaDados> fullList = (ArrayList<MetaDados>) getIntent().getParcelableExtra("metaDadosFull");
for (MetaDados metaDados : fullList) {
Log.d(Constants.DOWNLOAD_SELECTED_ACTIVITY, metaDados.getName());
}
ArrayList<MetaDados> presList = (ArrayList<MetaDados>) getIntent().getParcelableExtra("metaDadosPres");
for (MetaDados metaDados : presList) {
Log.d(Constants.DOWNLOAD_SELECTED_ACTIVITY, metaDados.getName());
}
Use Intent.putParcelableArrayListExtra() instead of putExtra(), and getParcelableArrayListExtra() instead of getParcelableExtra(). You can lose the casts as well, that may be where it's blowing up.

How to pass a two diamentional array from one activity to another activity?

I have a problem with passing my 2D string array from one activity to another activity
I tried some codes...but they show some errors
My string array is:
String[][] commuterDetails=new String[2][5];
commuterDetails=
{
{ "a", "b","c", "d","e" },
{"f", "g","h", "i","j" }
};
And I tried some codes
In first Activity
Intent summaryIntent = new Intent(this, Second.class);
Bundle b=new Bundle();
b.putSerializable("Array", commuterDetails);
summaryIntent.putExtras(b);
startActivity(summaryIntent);
In second activity
Bundle b = getIntent().getExtras();
String[][] list_array = (String[][])b.getSerializable("Array");
But it showing error
Caused by: java.lang.ClassCastException: [Ljava.lang.Object;
I am new in android, please help me
You may define a custom class which implements Parcelable and contains logic to read and write 2-dimensional-array from/to Parcel. Afterwards, put that parcelable object inside Bundle for transportation.
UPDATE
public class MyParcelable implements Parcelable{
public String[][] strings;
public String[][] getStrings() {
return strings;
}
public void setStrings(String[][] strings) {
this.strings = strings;
}
public MyParcelable() {
strings = new String[1][1];
}
public MyParcelable(Parcel in) {
strings = (String[][]) in.readSerializable();
}
#Override
public int describeContents() {
return 0;
}
#Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeSerializable(strings);
}
public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() {
#Override
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
#Override
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
}
make your commuterDetails static and access in other activity like this
FirstActivity.commuterDetails[][]

Android: passing object between activities and make it parcelable

New to Android programming. Having trouble to pass the object between activities and make it parcelable. Could somebody tell me what the problem could be? I want to know whether the logic is sound.
public class MainActivity extends Activity {
private Bundle MyActivityParams;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MyActivity.class);
MyActivityParams = fillInData(MyActivityParams);
intent.putExtras(MyActivityParams);
startActivity(intent, savedInstanceState);
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
private Bundle fillInData(Bundle bundle){
bundle.putFloat("com.company.MyActivity.FL", 12);
bundle.putFloat("com.company.MyActivity.VH", 100);
bundle.putFloat("com.company.MyActivity.const", 1);
return bundle;
}
}
public class DisplayActivity extends Activity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
displayData();
}
private void displayData(){
//ActivityData is from MyActivity
ActivityData data = new ActivityData(getIntent().getExtras());
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_display, menu);
return true;
}
}
public class MyActivity extends Activity {
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
displayParams();
}
private void displayParams(){
ActivityData dataBundle = new ActivityData((getIntent()).getExtras());
transfer(dataBundle);
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_algorithm, menu);
return true;
}
public void transfer(ActivityData incomingdata){
startActivity(incomingdata.getIntent());
}
protected static class ActivityData{
private Bundle data;
private TextView text;
private Intent intent;
public ActivityData(Bundle bundle){
/*data = bundle;
intent = new Intent(null, DisplayActivity.class);
text = new TextView(null);*/
}
public void display(String key){
this.text.setText(data.getString(key));
//not allowed: startActivity(intent);
//not allowed either: setContentView(text);
}
public Intent getIntent() {
return intent;
}
public void setIntent(Intent intent) {
this.intent = intent;
}
public TextView getText() {
return text;
}
public void setText(TextView text) {
this.text = text;
}
public Bundle getData() {
return data;
}
public void setData(Bundle data) {
this.data = data;
}
}
}
Let's have a Person class
public class Person {
private String name;
private String email;
private int age;
public Person(int age, String name, String email) {
this.age = age;
this.name = name;
this.email = email;
}
}
A parcelable one would look like this
public class ParcelablePerson implements Parcelable {
private final Person person;
private ParcelablePerson(Parcel parcel) {
this.person = new Person(parcel.readInt(), parcel.readString(), parcel.readString());
}
public ParcelablePerson(Person person) {
this.person = person;
}
public Person getPerson() {
return person;
}
#Override
public int describeContents() {
return 0;
}
// This is the method where you disassembly your object to pieces
#Override
public void writeToParcel(Parcel parcel, int flags) {
parcel.writeInt(person.getAge());
parcel.writeString(person.getName());
parcel.writeString(person.getEmail());
}
public static final Creator<ParcelablePerson> CREATOR = new Creator<ParcelablePerson>() {
// And here you create a new instance from a parcel using the first constructor
#Override
public ParcelablePerson createFromParcel(Parcel parcel) {
return new ParcelablePerson(parcel);
}
#Override
public ParcelablePerson[] newArray(int size) {
return new ParcelablePerson[size];
}
};
}
The crucial thing in the process is to have the same order of the variables in private ParcelablePerson(Parcel parcel) constructor and public void writeToParcel(Parcel parcel, int flags) method... You can see it on the age property which is an int.
try this one.
ParcelTest.java
import java.util.HashMap;
import android.os.Parcel;
import android.os.Parcelable;
public class ParcelTest implements Parcelable {
private HashMap map;
public ParcelTest() {
map = new HashMap();
}
public ParcelTest(Parcel in) {
map = new HashMap();
readFromParcel(in);
}
public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {
public ParcelTest createFromParcel(Parcel in) {
return new ParcelTest(in);
}
public ParcelTest[] newArray(int size) {
return new ParcelTest[size];
}
};
#Override
public int describeContents() {
return 0;
}
#Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(map.size());
for (String s: map.keySet()) {
dest.writeString(s);
dest.writeString(map.get(s));
}
}
public void readFromParcel(Parcel in) {
int count = in.readInt();
for (int i = 0; i < count; i++) {
map.put(in.readString(), in.readString());
}
}
public String get(String key) {
return map.get(key);
}
public void put(String key, String value) {
map.put(key, value);
}
}
ExampleSupplierActivity.java
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
public class ExampleSupplierActivity extends Activity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ParcelTest p = new ParcelTest();
p.put("green", "go");
p.put("yellow", "wait");
p.put("red", "stop");
Bundle b = new Bundle();
b.putParcelable("com.example.trafficlight", p);
Intent i = new Intent(this, ExampleConsumerActivity.class);
i.putExtras(b);
startActivity(i);
}
}
ExampleConsumerActivity.java
import android.app.Activity;
import android.os.Bundle;
public class ExampleConsumerActivity extends Activity {
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle b = getIntent().getExtras();
ParcelTest p = b.getParcelable("com.example.trafficlight");
String red = p.get("red");
// ...
}
}
try this out this code work for me. but i have implement serializable rather than parcelable.
Try to implement parcelable rather than serializable . and try it if its work. i havnt tried this but implementing parcelable.
To pass and object to another activity:
in activity A
make sure the class implements the serializable interface
create a new intent
create a new bundle
use the putSerializeable method to add the object to the bundle with a key
put the bundle in the intent by using the putExtras method
start the activity using the startActivity method
Specifically,
Intent intent = new Intent(ShoulderExerciseScreen.this, ExercisesScreen.class);
Bundle bundle = new Bundle();
bundle.putSerializable("exercise", new Exercise("BenchPress));
intent.putExtras(bundle);
startActivity(intent);
in activity B
declare and object of the type you want passed
use the getIntent method to get the intent
use the getSerializeableExtra to get the the value using the key
cast the returned value from getSerializeableExtra and the desired type
Specifically,
Exercise ex = (Exercise)getIntent().getSerializableExtra("exercise");
if(ex != null)
{
//do something
}

Passing ArrayLists in Android

I'm trying to pass array lists between activities in Android. The lists contains strings. I've read a lot about Parcelable. Would I need to create a Parcelable to pass a String array list? As of now I am using putStringArrayListExtra() and getSringArrayListExtra() to pass the lists through intents.
Here is some of my code.
Intent load = new Intent(getApplicationContext(), HelloTabWidget.class);
load.putStringArrayListExtra("albums", albums);
load.putStringArrayListExtra("songs", songs);
load.putStringArrayListExtra("artists", artists);
load.putStringArrayListExtra("fileName", fileName);
This is my onCreate method for the acticity which obtains the array list.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.songlist);
Bundle extras = getIntent().getExtras();
isArtists = extras.getBoolean("artists");
isAlbums = extras.getBoolean("albums");
isSongs = extras.getBoolean("songs");
Intent get = getIntent();
songs = get.getStringArrayListExtra("songs");
artists = get.getStringArrayListExtra("artists");
albums = get.getStringArrayListExtra("albums");
fileName = get.getStringArrayListExtra("fileName");
if(isArtists == true)
updateArtistsList();
else if(isAlbums == true)
updateAlbumsList();
else if(isSongs == true)
updateSongList();
}
The class which retrieves the list is supposed to create a listView from the data in the lists. Whenever I run the code i get nullPointerExceptions when trying to make the lists. I know that my listView code works, so I have narrowed down the problem to the intents which pass the array lists.
Thanks in advance.
EDIT:
Here are the first few lines from the logcat.
12-28 03:03:42.313: E/AndroidRuntime(873): FATAL EXCEPTION: main
12-28 03:03:42.313: E/AndroidRuntime(873): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.adam.mediaplayer/com.adam.mediaplayer.HelloTabWidget}: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.adam.mediaplayer/com.adam.mediaplayer.MakeListActivity}: java.lang.NullPointerException
It depends on the type of arraylist
putIntegerArrayListExtra(String name, ArrayList<Integer> value)
putParcelableArrayListExtra(String name, ArrayList<? extends Parcelable> value)
putStringArrayListExtra(String name, ArrayList<String> value)
putCharSequenceArrayListExtra(String name, ArrayList<CharSequence> value)
Then you can read from you next activity by replacing put with get with key string as argument,eg
myIntent.getStringArrayListExtra("arrayListName");
Here is how you can pass an ArrayList :
MyListClass.java - Custom class
public class MyListClass implements Parcelable{
private int test;
public MyListClass()
{}
public MyListClass(Parcel read){
test = read.readInt();
}
public int getTest() {
return test;
}
public void setTest(int test) {
this.test = test;
}
public static final Parcelable.Creator<MyListClass> CREATOR =
new Parcelable.Creator<MyListClass>() {
#Override
public MyListClass createFromParcel(Parcel source) {
return new MyListClass(source);
}
#Override
public MyListClass[] newArray(int size) {
return new MyListClass[size];
}
};
#Override
public int describeContents() {
return 0;
}
#Override
public void writeToParcel(Parcel arg0, int arg1) {
arg0.writeInt(test);
}
}
MyParcelable.java
public class MyParcelable implements Parcelable {
private List<MyListClass> arrList = new ArrayList<MyListClass>();
private int myInt = 0;
private String str = null;
public String getStr() {
return str;
}
public void setStr(String str) {
this.str = str;
}
public List<MyListClass> getArrList() {
return arrList;
}
public void setArrList(List<MyListClass> arrList) {
this.arrList = arrList;
}
public int getMyInt() {
return myInt;
}
public void setMyInt(int myInt) {
this.myInt = myInt;
}
MyParcelable() {
// initialization
arrList = new ArrayList<MyListClass>();
}
public MyParcelable(Parcel in) {
myInt = in.readInt();
str = in.readString();
in.readTypedList(arrList, MyListClass.CREATOR);
}
#Override
public int describeContents() {
return 0;
}
#Override
public void writeToParcel(Parcel outParcel, int flags) {
outParcel.writeInt(myInt);
outParcel.writeString(str);
outParcel.writeTypedList(arrList);
}
public static final Parcelable.Creator<MyParcelable> CREATOR = new Parcelable.Creator<MyParcelable>() {
#Override
public MyParcelable createFromParcel(Parcel in) {
return new MyParcelable(in);
}
#Override
public MyParcelable[] newArray(int size) {
return new MyParcelable[size];
}
};
}
MainAcitivty.java
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
arrList.add(new MyListClass());
arrList.get(0).setTest(200);
MyParcelable object = new MyParcelable();
object.setMyInt(100);
object.setArrList(arrList);
Intent intent = new Intent(MainActivity.this,ReceiverParcel.class);
intent.putExtra("parcel", object);
startActivity(intent);
}
ReceiverParcel.java
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle b = getIntent().getExtras();
MyParcelable object = b.getParcelable("parcel");
System.out.println(object.getArrList().get(0).getTest());
System.out.println(object.getMyInt());
}

Categories

Resources