如何在片段中使用Parcelable获取数据? [英] How to use Parcelable in fragment for getting data?

查看:170
本文介绍了如何在片段中使用Parcelable获取数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我可以在Activity中使用Parcelable,但我不知道如何在Fragment中使用它。



我在FragmentGet中有一个ListFragment来显示ListView中的所有行数据库,我想在单击时在另一个Fragment中获得ListView的详细信息,我使用Parcelable在Fragments之间传递数据。



这是我的Test.java:

  import android.os.Parcel; 
导入android.os.Parcelable;

public class Test实现Parcelable {

private int studentNumber;
private String studentName;
私人字符串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;

$ b $ 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];
}
};

在FragmentSend.java中,我想将数据发送到FragmentGet.java,这是代码:

  public class FragmentSend extends ListFragment {

//类
TestReadData readData ;
TestDataSource dataSource;

私人列表< Test> listTest;

public FragmentSend(){
//必需的空公共构造函数
}


@TargetApi(Build.VERSION_CODES.M)
@Override
public view onCreateView(LayoutInflater inflater,ViewGroup container,
Bundled savedInstanceState){

View layout = inflater.inflate(R.layout.fragment_send,container,假);

readData = new TestReadData(getContext());
dataSource = new TestDataSource(getContext());

refreshStudentList(inflater);

返回布局;


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();

$ b @Override
public void onListItemClick(ListView l,View v,int position,long id){
super.onListItemClick(l,v,position, ID);

Test model = listTest.get(position);

//这三行代码适用于Activity not Fragment!
Intent intent = new Intent(getContext(),FragmentGet.class);
intent.putExtra(Student,model);
// startActivity(intent);

//我使用此代码片段
片段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();


$ / code>

在FragmentGet.java中,我得到这样的数据:

  public class FragmentGet extends Fragment {

//类
测试模型;

//变量
私人列表< Test> listTest;

public FragmentGet(){
//必需的空公共构造函数
}


@Override
public View onCreateView LayoutInflater inflater,ViewGroup容器,
Bundled savedInstanceState){
//膨胀这个片段的布局
View layout = inflater.inflate(R.layout.fragment_get,container,false);

//关联的类
model = new Test(Parcel.obtain());

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

返回布局;
}

当我运行该应用程序时,我会收到此错误:


试图调用虚拟方法'android.os.Parcelable
android.os.Bundle.getParcelable(java.lang.String)'空对象
引用

我该如何解决这个错误?

Fragments 是通过使用 Bundles 而不是来传递的。解决方案 code> Intents 。



FragmentSend 更改

  Intent intent = new Intent(getContext(),FragmentGet.class); 
intent.putExtra(Student,model);

片段fragmentGet = new FragmentGet();
fragmentGet.setArguments(intent.getExtras()); b




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

并且接收 FragmentGet 变化中的数据

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

  Bundle bundle = this.getArguments(); 
if(bundle!= null){
model = bundle.getParcelable(Student);
}


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

I have a ListFragment in FragmentGet to display all rows database in ListView, I want to get details of ListView in another Fragment when it's clicked, I use Parcelable to passing data between 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 the FragmentGet.java I get data like this:

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 app, I will get this error:

Attempt to invoke virtual method 'android.os.Parcelable android.os.Bundle.getParcelable(java.lang.String)' on a null object reference

how can I fix this error?

解决方案

Passing data to Fragments is carried by 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 this

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

And to receive the data in FragmentGet change

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

to

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

这篇关于如何在片段中使用Parcelable获取数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆