How to use Parcelable in a fragment to get data?

I can use Parcelable in Activity, but I don't know how to use it in Fragment.

I have a ListFragment in a FragmentGet to display the entire row database in a ListView, I want to get ListView details in another fragment, when it clicked, I use Parcelable to transfer data between the fragments.

This is my Test.java:

import android.os.Parcel; import android.os.Parcelable; public class Test implements Parcelable { private int studentNumber; private String studentName; private String studentFamily; public int getStudentNumber() { return studentNumber; } public void setStudentNumber(int studentNumber) { this.studentNumber = studentNumber; } public String getStudentName() { return studentName; } public void setStudentName(String studentName) { this.studentName = studentName; } public String getStudentFamily() { return studentFamily; } public void setStudentFamily(String studentFamily) { this.studentFamily = studentFamily; } public Test() { } public Test(Parcel read) { studentNumber = read.readInt(); studentName = read.readString(); studentFamily = read.readString(); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel write, int flags) { write.writeInt(studentNumber); write.writeString(studentName); write.writeString(studentFamily); } public static final Parcelable.Creator<Test> CREATOR = new Parcelable.Creator<Test>() { @Override public Test createFromParcel(Parcel source) { return new TestP(source); } @Override public Test[] newArray(int size) { return new TestP[size]; } }; } 

In FragmentSend.java I want to send data to FragmentGet.java, this is the code:

 public class FragmentSend extends ListFragment { // Classes TestReadData readData; TestDataSource dataSource; private List<Test> listTest; public FragmentSend() { // Required empty public constructor } @TargetApi(Build.VERSION_CODES.M) @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View layout = inflater.inflate(R.layout.fragment_send, container, false); readData = new TestReadData(getContext()); dataSource = new TestDataSource(getContext()); refreshStudentList(inflater); return layout; } public void refreshStudentList(LayoutInflater inflater) { listTest = readData.getAllStudentRows(); ArrayAdapter<Test> testAdapter = new TestFragmentListAdapter(inflater.getContext(), listTest); setListAdapter(testAdapter); } @Override public void onResume() { super.onResume(); dataSource.open(); } @Override public void onPause() { super.onPause(); dataSource.close(); } @Override public void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); Test model = listTest.get(position); // this three line code is for Activity not Fragment! Intent intent = new Intent(getContext(), FragmentGet.class); intent.putExtra("Student", model); // startActivity(intent); // I use this code for fragment Fragment fragmentGet = new FragmentGet(); fragmentGet.setArguments(intent.getExtras()); FragmentManager fragmentManager = getActivity().getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.frame_container, fragmentGet); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit(); } 

In FragmentGet.java, I get this data:

 public class FragmentGet extends Fragment { // Classes Test model; // Variables private List<Test> listTest; public FragmentGet () { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View layout = inflater.inflate(R.layout.fragment_get, container, false); // Classes Associated model = new Test(Parcel.obtain()); Bundle bundle = getActivity().getIntent().getExtras(); model = bundle.getParcelable("Student"); return layout; } 

When I run the application, I will get this error:

Trying to call the virtual method 'android.os.Parcelable android.os.Bundle.getParcelable (java.lang.String)' on a null object Link

How can I fix this error?

+8
android parcelable fragment
source share
1 answer

Data is transferred to Fragments using Bundles , but not Intents .

In FragmentSend change

 Intent intent = new Intent(getContext(), FragmentGet.class); intent.putExtra("Student", model); Fragment fragmentGet = new FragmentGet(); fragmentGet.setArguments(intent.getExtras()); 

to that

 Fragment fragmentGet = new FragmentGet(); Bundle bundle = new Bundle(); bundle.putParcelable("Student", model); fragmentGet.setArguments(bundle); 

And to get the data in the FragmentGet change

 Bundle bundle = getActivity().getIntent().getExtras(); model = bundle.getParcelable("Student"); 

to

 Bundle bundle = this.getArguments(); if (bundle != null) { model = bundle.getParcelable("Student"); } 
+26
source share

All Articles