实现startForResult时,我的应用失败,并出现包裹错误

时间:2019-08-11 21:30:14

标签: android parcel fragmentation

我有一个包含多个片段的容器。

我尝试在第一个片段中实现以下内容,然后使用第二个片段中的Bundle发送回数据。

 @Override
public void onFragmentResult(int requestCode, int resultCode, Bundle data) {
    super.onFragmentResult(requestCode, resultCode, data);
    if (requestCode == REQ_MODIFY_FRAGMENT && resultCode == RESULT_OK && data != null) {
        mTitle = data.getString(KEY_RESULT_TITLE);
        mToolbar.setTitle(mTitle);
        getArguments().putString(ARG_TITLE, mTitle);
        Toast.makeText(_mActivity, R.string.modify_title, Toast.LENGTH_SHORT).show();
    }
}

但是,当我转到第三个片段(它们都按顺序排列)并且退出应用程序时(例如,向日历添加事件或从坐标加载Google地图),应用程序会连续失败包裹错误。我已经检查了所有对象和包裹,但都不是不正确的。

一旦我从片段1中删除了onFragmentResult,该应用程序就会停止崩溃。我花了好几个小时,但仍无法解决。有帮助的人吗?

这是我的Logcat的一些输出

    at android.os.BaseBundle.writeToParcelInner(BaseBundle.java:1579)
    at android.os.Bundle.writeToParcel(Bundle.java:1233)
    at android.os.Parcel.writeBundle(Parcel.java:931)
    read: unexpected EOF!

以上输出重复了几十次,并以EOF结尾!

1 个答案:

答案 0 :(得分:0)

我终于找到答案了。在第二个片段中,我正在设置setFragmentResult onCreateView,每次我离开应用程序并返回到它时都会导致失败。我通过将代码移到片段的后退按钮中来解决此问题,如下所示:

    @Override
public boolean onBackPressedSupport() {

    Bundle bundle = new Bundle();
    bundle.putBoolean("data_refreshed", true);
    setFragmentResult(RESULT_OK, bundle);

    Toast.makeText(_mActivity, "onBackPressedSupport-->return false, " + getString(R.string.upper_process), Toast.LENGTH_SHORT).show();
    return false;
}

onBackPressedSupport是我在自己的工具栏上创建的自定义函数。感谢Blink Kai,让我不断前进。

更新:我知道在片段的onDestroyView中实现了此功能。比编写我自己的自定义函数容易得多:

    @Override
public void onDestroyView() {
    super.onDestroyView();
    Bundle bundle = new Bundle();
    bundle.putBoolean("data_refreshed", true);
    setFragmentResult(RESULT_OK, bundle);
}