fragment与Activity通信时,我们常常用在activity中setArgument然后再fragment中用getArgument的方法来获取activity想要传给fragment的数据,但我今天用这个方法时报了空指针异常,耽误了我不少时间,下面我就将产生空指针的原因和解决方法跟大家分享一下。
原因:
/**
* Return the arguments supplied when the fragment was instantiated,
* if any.
*/
final public Bundle getArguments() {
return mArguments;
}
这是getArgument的源码,上面注释的意思就是这个方法使用的前提是fragment未被实例化也就是还没有跟activity绑定,问题就处在这里,我们有时用fragment时使用xml来直接绑定fragment,那么在activity执行onCreat方法的时候fragment就已经被实例化,即使在下面执行如下代码片,已经被绑定的fragment也无法拿到bundle
Fragment unlawLeft = new MineUnLawLeftFgm();
Bundle bundle = new Bundle();
bundle.putSerializable("userToFgm",user);
unlawLeft.setArguments(bundle);
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
//替换容器中的fragment
fragmentTransaction.replace(R.id.fgmUnlawContainer,unlawLeft);
//提交事务
fragmentTransaction.commit();
解决方法:
既然不能用getArgument的方法,我们就绕一下远路用
user = (User) getActivity().getIntent().getSerializableExtra("users");
利用Activity直接获得bundle就可以解决问题啦~