getParcelable из Bundle иногда вызывает BadParcelableException в Java-Android - PullRequest
0 голосов
/ 30 августа 2018

[Ошибка]

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

Я помещаю посылку в корзину из этой функции, но я не думаю, что это является причиной.

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

1 Ответ

0 голосов
/ 30 августа 2018

возможно продублировано в этой статье: Как использовать Parcelable во фрагменте для получения данных?

Я видел твой код, не нашел ошибки. Вы сказали ", он не падает все время ", дайте мне понять, что вы не вставили исключение. если я, я напишу;

Bundle bundle = getArguments();
if (bundle != null) {
    BigItem bigItem = bundle.getParcelable("big_item");
}

потому что иногда фрагмент будет возобновлен без аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...