如何在片段中使用Parcelable获取数据? [英] How to use Parcelable in fragment for getting data?
问题描述
我可以在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)'空对象
引用
我该如何解决这个错误?
Bundles
而不是在 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屋!