从安卓活动传递到片段的可包裹对象



我正在尝试传递一个从活动implements Parcelable到片段的对象。我知道如何从一个活动传递到另一个活动。我只想试试这个。但是当我收到对象时,它总是收到null.如何解决此问题?

currentObject是实现 Parcelable 的类的对象实例

ContentMainFragment是片段类

在活动中

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

谢谢。

试试这个

首先,改变一些小东西。

主活动.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();

内容主片段.java

// 1. Get the object in onCreate();
if (getArguments() != null) { 
link = getArguments().getParcelable("SampleObject").getLink(); 
}

其次,您的方法似乎没有问题,然后仔细检查您是否正在解析活动中的有效对象(currentObject(。

我向您展示了一些代码来帮助您:

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

主活动

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;
}
}

此代码工作正常。

但通常在我的情况下,当我必须在活动或 Fragmetns 之间传递数据时。我不实现包裹。我使用可序列化,因为实现速度更快。

可序列化的示例:

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

主活动

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;
}
}

我希望它对你有所帮助。

您需要将作业更改为要使用的类而不是父类来接收bundle数据,

在这里编辑:

更改为

ContentMainFragment fragment = new ContentMainFragment(); //Updated

而不是

Fragment fragment = new ContentMainFragment(); //Old

最新更新