web-dev-qa-db-fra.com

Comment utiliser Parcelable en fragment pour obtenir des données?

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?

12
Salar Rastari

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");
}
43
DmitryArc