java - Bundle中的getParcelable有时会在java android中导致BadParcelableException
问题描述
[错误]
Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mypackage/folders.views.activity.MainActivity$17}:
android.os.BadParcelableException: Parcelable protocol requires a Parcelable.Creator object called CREATOR on class
我从以下代码中得到了 BadParcelableException,但不知道为什么会得到这个。我在片段的 onCreateView 中调用此代码。神秘的是它不会一直崩溃。我现在完全无能为力了。如果您有一些提示或示例,我很乐意收到您的来信!
final BigItem bigItem = getArguments().getParcelable("big_item"); ← I get error at this code
我将这个功能的包裹放在了 budle 中,但我认为这不是原因。
public static BigFragment newInstance(@NonNull final BigItem bigItem, @NonNull final BigListener eventListener) {
final BigFragment frag = new BigFragment();
Bundle args = new Bundle();
args.putParcelable("big_item", bigItem);
frag.setArguments(args);
return frag;
}
这是 BigItem 的代码如下。
public class BigItem implements Parcelable {
public long id;
public String image;
public String text;
public String web;
public BigItem() {
}
protected BigItem(Parcel in) {
id = in.readLong();
image = in.readString();
text = in.readString();
web = in.readString();
}
public static final Creator<BigItem> CREATOR = new Creator<BigItem>() {
@Override
public BigItem createFromParcel(Parcel in) {
return new BigItem(in);
}
@Override
public BigItem[] newArray(int size) {
return new BigItem[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel par, int flags) {
par.writeLong(id);
par.writeString(image);
par.writeString(text);
par.writeString(web);
}
}
以下带有 FragmentTransaction 的方法在我的 MainActivity 中
private void addBigFragment(@NonNull final BigItem bigItem, @NonNull final BigFragment.BigEventListener eventListener) {
final FragmentManager fragmentManager = getSupportFragmentManager();
rmBigFragment(fragmentManager);
final FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
mBigFragment = BigFragment.newInstance(bigItem, eventListener);
fragmentTransaction.replace(R.id.main_big_layout_fragment, mBigFragment, BigFragment.TAG);
fragmentTransaction.commit();
}
解决方案
可能与本文重复:如何在片段中使用 Parcelable 获取数据?
我看了你的代码,没有发现错误。你说“它不会一直崩溃”,让我明白你没有插入异常。如果是我,我会写;
Bundle bundle = getArguments();
if (bundle != null) {
BigItem bigItem = bundle.getParcelable("big_item");
}
因为有时片段会在没有参数的情况下恢复。
推荐阅读
- android - NavHostFragment 无法从 android 中的片段访问
- asp.net-core - Openid 连接中 Web api 的范围
- wordpress - 每当我更改页面导航时,我都会在 wordpress 中创建按钮导航(意味着整个页面都在更改)
- c# - ASP.Net MVC auto slugify Routes
- java - Shuffling images
- python - How can I convert a pandas column of time to different columns of hours and minutes?
- arrays - How to save a subdocument array in an existing schema whose data is coming from a dynamic form?
- python - Creating a table in Python without using Pandas
- python - add one more new column supplytypecheck, check if supply type IMPG that should be Y else N
- wordpress - Facing issue to get updated result by using "TI Wishlist" wordpress plugin API in IONIC