从 android Activity 传递到 Fragment 的 Parcelable 对象
Posted
技术标签:
【中文标题】从 android Activity 传递到 Fragment 的 Parcelable 对象【英文标题】:Parcelable object passing from android activity to fragment 【发布时间】:2019-02-09 20:13:04 【问题描述】:我正在尝试将implements Parcelable
的对象从活动传递到片段。我知道如何从一个活动传递到另一个活动。我只是想试试这个。但是当我收到对象时,它总是收到null
。我该如何解决这个问题?
currentObject
是实现 Parcelable 的类的对象实例
ContentMainFragment
是 Fragment 类
在活动中
Fragment fragment = new ContentMainFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("SampleObject", currentObject);
fragment.setArguments(bundle);
在片段中
Bundle bundle = this.getArguments();
if (bundle != null)
currentObject = bundle.getParcelable("SampleObject");
link = currentObject.getLink();
谢谢。
【问题讨论】:
为什么不在ContentMainFragment
的构造函数中传递对象?
【参考方案1】:
试试这个
首先,改变一些小事。
MainActivity.java
// 1. Parse the object to the fragment as a bundle;
ContentMainFragment contentMainFragment = new ContentMainFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("SampleObject", currentObject);
contentMainFragment.setArguments(bundle);
// 2. Commit the fragment.
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, contentMainFragment).commit();
ContentMainFragment.java
// 1. Get the object in onCreate();
if (getArguments() != null)
link = getArguments().getParcelable("SampleObject").getLink();
其次,您的方法似乎没有问题,然后仔细检查您是否正在解析Activity中的有效对象(currentObject)。
【讨论】:
它不起作用,因为我没有将// 2. Commit the fragment
部分放入 MainActivity
我很高兴能提供帮助。【参考方案2】:
我给你看一些代码来帮助你:
型号
public class Model implements Parcelable
private String name;
public Model()
public String getName()
return name;
public void setName(String name)
this.name = name;
protected Model(Parcel in)
name = in.readString();
public static final Creator<Model> CREATOR = new Creator<Model>()
@Override
public Model createFromParcel(Parcel in)
return new Model(in);
@Override
public Model[] newArray(int size)
return new Model[size];
;
@Override
public int describeContents()
return 0;
@Override
public void writeToParcel(Parcel parcel, int i)
parcel.writeString(name);
MainActivity
Model currentObject = new Model();
currentObject.setName("Testing arguments");
TestFragment fragment = new TestFragment();
Bundle bundle = new Bundle();
bundle.putParcelable("SampleObject", currentObject);
fragment.setArguments(bundle);
测试片段
public class TestFragment extends Fragment
Model model;
public TestFragment()
// Required empty public constructor
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
Bundle bundle = this.getArguments();
if (bundle != null)
model = bundle.getParcelable("SampleObject");
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_test, container, false);
TextView tvArgument = v.findViewById(R.id.tvTestArgument);
tvArgument.setText(model.getName());
return v;
这段代码可以正常工作。
但通常在我必须在活动或片段之间传递数据时。我没有实现 Parcelable。我使用 Serializable 是因为实现起来更快。
可序列化的示例:
型号
public class Model implements Serializable
private String name;
public Model()
public String getName()
return name;
public void setName(String name)
this.name = name;
protected Model(Parcel in)
name = in.readString();
MainActivity
Model currentObject = new Model();
currentObject.setName("Testing arguments");
TestFragment fragment = new TestFragment();
Bundle bundle = new Bundle();
bundle.putSerializable("SampleObject");
测试片段
public class TestFragment extends Fragment
Model model;
public TestFragment()
// Required empty public constructor
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
Bundle bundle = this.getArguments();
if (bundle != null)
model = (Model) bundle.getSerializable("SampleObject");
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_test, container, false);
TextView tvArgument = v.findViewById(R.id.tvTestArgument);
tvArgument.setText(model.getName());
return v;
希望对你有帮助。
【讨论】:
【参考方案3】:您需要将分配更改为要使用的类而不是父类才能接收bundle
数据,
在此处编辑:
改成
ContentMainFragment fragment = new ContentMainFragment(); //Updated
代替
Fragment fragment = new ContentMainFragment(); //Old
【讨论】:
以上是关于从 android Activity 传递到 Fragment 的 Parcelable 对象的主要内容,如果未能解决你的问题,请参考以下文章
从 android Activity 传递到 Fragment 的 Parcelable 对象
如何将值从基本适配器传递到 Android 中的 Activity
android ListView 将隐藏值从一个 Activity 传递到另一个
android中怎样动态的将数据从service上传递到activity