Bundle返回long而不是Parcelable

时间:2017-06-22 09:49:51

标签: java android bundle

activityA我有listview,其中每个项目都是自定义Parcelable对象。在listViewItemClick我展示了一个带有两个参数的fragment,我使用此方法将bundle放入其中:

public void openFragment(CustomParcelable parcelableObject, long objectID) {
    FragmentA fragmentA = new FragmentA();
    Bundle bundle = new Bundle();
    bundle.putParcelable(FragmentA.KEY, parcelableObject);
    bundle.putLong(FragmentA.KEY, objectID);
    fragmentA.setArguments(bundle);
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.fragmentContainer, fragmentA);
    transaction.commitAllowingStateLoss();
}

FragmentA我需要使用所选的自定义Parcelable对象,因此我从onCreate bundle获取此对象:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Bundle bundle = this.getArguments();

    currentObject = bundle.getParcelable(KEY);
    objectID = bundle.getLong(KEY);

    ...
}

注意:currentObject是CustomParcelable中定义的私有fragment,objectID是fragment中定义的私有long,public final string中定义的KEY是fragment }}

当我稍后在我的一个方法中使用currentObject时,它返回NPE,因为currentObject为null。调试时,它显示它获得Parcelable,但具有objectID的值。

Is the data passed cor数据是否正确传递?究竟是什么导致currentObject为null?

1 个答案:

答案 0 :(得分:3)

您必须为每个数据使用不同的密钥。因为bundle元素是处理名称值对,一个键和对应的值,

你做了什么,两个数据使用相同的密钥,所以第一个数据被第二个长数据写入,

例如,如果您看到putParcelable

,则会显示this
  

将Parcelable值插入此Bundle的映射中,替换给定键的任何现有值。键或值可以为null。

你应该做的是

public void openFragment(CustomParcelable parcelableObject, long objectID) {
    FragmentA fragmentA = new FragmentA();
    Bundle bundle = new Bundle();
    bundle.putParcelable(FragmentA.KEY1, parcelableObject);
    bundle.putLong(FragmentA.KEY2, objectID);
    fragmentA.setArguments(bundle);
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.fragmentContainer, fragmentA);
    transaction.commitAllowingStateLoss();
}

和fragmentA

currentObject = bundle.getParcelable(KEY1);
objectID = bundle.getLong(KEY2);

希望这能清除你的怀疑