在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的值。
答案 0 :(得分:3)
您必须为每个数据使用不同的密钥。因为bundle元素是处理名称值对,一个键和对应的值,
你做了什么,两个数据使用相同的密钥,所以第一个数据被第二个长数据写入,
例如,如果您看到putParcelable
将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);
希望这能清除你的怀疑