I've implemented parcelable for my custom class:
public class Tag implements Parcelable {
int id;
int type;
int proficiencyLevel;
HashMap<String, String> translations;
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeInt(type);
dest.writeInt(proficiencyLevel);
// if this part is uncommented I get a NullPointerException
/*
dest.writeInt(translations.size());
for (HashMap.Entry<String, String> entry : translations.entrySet()) {
dest.writeString(entry.getKey());
dest.writeString(entry.getValue());
}
*/
}
public static final Parcelable.Creator<Tag> CREATOR = new Parcelable.Creator<Tag>() {
public Tag createFromParcel(Parcel in) {
return new Tag(in);
}
public Tag[] newArray(int size) {
return new Tag[size];
}
};
private Tag(Parcel in) {
id = in.readInt();
type = in.readInt();
proficiencyLevel = in.readInt();
// I've put breakpoint here and it seems to work OK, but then I get a NullPointerException
// deserialize `translations` field
/*int size = in.readInt();
for (int i = 0; i < size; i++) {
String key = in.readString();
String value = in.readString();
translations.put(key, value);
}*/
}
}
Now I pass it like this from activity A:
Tag[] tagsList = new Gson().fromJson(tags, Tag[].class);
Intent activityTagsSelectorLauncher = new Intent(this, ActivityTagsSelector.class);
activityTagsSelectorLauncher.putParcelableArrayListExtra("tagsList", new ArrayList<>(Arrays.asList(tagsList)));
startActivityForResult(activityTagsSelectorLauncher, SELECT_TAGS_REQUEST);
And receive it like so in activity B:
ArrayList<Tag> tagsList = getIntent().getParcelableArrayListExtra("tagsList");
It's all working OK if I don't write HashMap<String, String> translations
field. I get NullPointerException
when activity B starts. I've put breakpoint inside constructor private Tag(Parcel in) {
and there it seems that everything works fine so I don't understand what I'm doing wrong.