如何在片段中使用 Parcelable 获取数据?
Posted
技术标签:
【中文标题】如何在片段中使用 Parcelable 获取数据?【英文标题】:How to use Parcelable in fragment for getting data? 【发布时间】:2016-02-12 06:12:55 【问题描述】:我可以在 Activity 中使用 Parcelable 但我不知道如何在 Fragment 中使用它。
我在 FragmentGet 中有一个 ListFragment 用于在 ListView 中显示所有行数据库,我想在单击另一个 Fragment 时获取 ListView 的详细信息,我使用 Parcelable 在 Fragment 之间传递数据。
这是我的 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];
;
在 FragmentSend.java 中我想向 FragmentGet.java 发送数据,代码如下:
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();
在 FragmentGet.java 我得到这样的数据:
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;
当我运行应用程序时,我会收到此错误:
尝试调用虚拟方法'android.os.Parcelable android.os.Bundle.getParcelable(java.lang.String)' 在一个空对象上 参考
我该如何解决这个错误?
【问题讨论】:
【参考方案1】:向Fragments
传递数据是使用Bundles
而不是Intents
。
在FragmentSend
改
Intent intent = new Intent(getContext(), FragmentGet.class);
intent.putExtra("Student", model);
Fragment fragmentGet = new FragmentGet();
fragmentGet.setArguments(intent.getExtras());
到这里
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");
【讨论】:
以上是关于如何在片段中使用 Parcelable 获取数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用对象列表在片段中实现newinstace模式[重复]