Je peux utiliser Parcelable dans Activity mais je ne sais pas comment l'utiliser dans Fragment.
J'ai un ListFragment dans FragmentGet pour afficher toutes les bases de données de lignes dans ListView, je veux obtenir des détails de ListView dans un autre Fragment quand il est cliqué, j'utilise Parcelable pour passer des données entre Fragments.
Ceci est mon 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];
}
};
}
Dans FragmentSend.Java, je veux envoyer des données à FragmentGet.Java, voici le 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();
}
Dans FragmentGet.Java, j'obtiens des données comme ceci:
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;
}
Lorsque j'exécute l'application, j'obtiendrai cette erreur:
Tentative d'appeler la méthode virtuelle 'Android.os.Parcelable Android.os.Bundle.getParcelable (Java.lang.String)' sur une référence d'objet nul
comment puis-je corriger cette erreur?
La transmission de données à Fragments
s'effectue en utilisant Bundles
mais pas Intents
.
Dans FragmentSend
changez
Intent intent = new Intent(getContext(), FragmentGet.class);
intent.putExtra("Student", model);
Fragment fragmentGet = new FragmentGet();
fragmentGet.setArguments(intent.getExtras());
pour ça
Fragment fragmentGet = new FragmentGet();
Bundle bundle = new Bundle();
bundle.putParcelable("Student", model);
fragmentGet.setArguments(bundle);
Et pour recevoir les données dans FragmentGet
changez
Bundle bundle = getActivity().getIntent().getExtras();
model = bundle.getParcelable("Student");
à
Bundle bundle = this.getArguments();
if (bundle != null) {
model = bundle.getParcelable("Student");
}