user90766
user90766

Reputation: 339

Object Reference when saving / retrieving parcelable from a fragment's Arguments bundle

I have a StudentList fragment, which has a List; the Student class implements Parcelable; clicking an item in the StudentList fragment invokes the following StudentFragment:

public static StudentFragment newInstance(Student student_) {
    StudentFragment fragment = new StudentFragment();
    Bundle args = new Bundle();
    args.putParcelable("STUDENT", student_);
    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle args = getArguments();
    if (args != null) {
        mStudent = args.getParcelable("STUDENT");
    }
}

private void setStudentName(String newName_) {
   mStudent.setName(newName_);
}

This fragment is instantiated from another "StudentList" fragment, which has a List; an object from his list is provided as the parameter to StudentFragment.newInstance().

I was surprised to see that any changes to mStudent in the "StudentFragment" automatically get reflected on the corresponding object. On checking further in the onCreate method of StudentFragment, I found that the mStudent object reference is the same as the reference of the object that was passed to newInstance.

When I stepped through the code, I found that the Student.writeToParcel is never called.

How is this possible? Shouldn't I get a NEW object reference when I call mStudent = args.getParcelable("STUDENT") ?

Does the "arguments" bundle or the Parcelable interface preserve some link to the object reference, and use the parcel/unparceling as a last resort?

Upvotes: 1

Views: 578

Answers (1)

user90766
user90766

Reputation: 339

This post states that there's no guarantee that writing/reading to/from a Bundle will cause parceling/unparceling. Moreover it states that one shouldn't assume either behavior. This is probably why I keep getting back the exact same reference in onCreate.

Upvotes: 1

Related Questions