Activity向Fragment传值后Fragment无数据返回?代码调试求助
解决Activity向Fragment传递数据时getArguments()返回null的问题
嘿,我一眼就看到问题所在了——你在代码里犯了一个很常见的小错误:创建了两个完全独立的Fragment实例,导致你设置的参数根本没传到实际显示的那个Fragment里!
问题根源分析
你先创建了Camera2BasicFragment的实例myObj,并且给它设置了包含参数的Bundle,但后续执行Fragment事务时,你调用的是Camera2BasicFragment.newInstance(),这会创建一个全新的Fragment实例,这个新实例完全没有被设置任何arguments,所以Fragment的getArguments()自然返回null。而你提到的savedInstanceState为空是正常的,因为这是Activity首次启动,还没有任何状态需要保存,这个和参数传递的问题无关。
两种修正方案
方案一:直接使用已设置参数的Fragment实例
修改Activity的onCreate方法,把事务中替换的Fragment改成你已经设置好参数的myObj:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String s = getIntent().getStringExtra("message"); Bundle bundle = new Bundle(); bundle.putString("params", s); // 创建Fragment实例并设置arguments Camera2BasicFragment myObj = new Camera2BasicFragment(); myObj.setArguments(bundle); setContentView(R.layout.activity_camera); if (null == savedInstanceState) { getFragmentManager().beginTransaction() .replace(R.id.container, myObj) // 这里使用已设置参数的实例 .commit(); } }
方案二:优化newInstance()方法(推荐的Fragment最佳实践)
更规范的做法是给Fragment添加一个带参数的newInstance静态方法,让它内部负责创建实例并设置arguments,这样能避免手动创建实例时的参数遗漏:
首先在Camera2BasicFragment中修改newInstance方法:
public static Camera2BasicFragment newInstance(String param) { Camera2BasicFragment fragment = new Camera2BasicFragment(); Bundle args = new Bundle(); args.putString("params", param); fragment.setArguments(args); return fragment; }
然后在Activity中调用这个带参数的newInstance方法:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); String s = getIntent().getStringExtra("message"); setContentView(R.layout.activity_camera); if (null == savedInstanceState) { getFragmentManager().beginTransaction() .replace(R.id.container, Camera2BasicFragment.newInstance(s)) // 传递参数 .commit(); } }
验证修改
完成上述任一修改后,在Fragment的onCreate方法中,getArguments()就能正常获取到你传递的参数了:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { String s = getArguments().getString("params"); // 这里就能拿到正确的参数值了 } }
内容的提问来源于stack exchange,提问作者Monica Das
相关产品推荐
相关产品推荐

