能否在onActivityResult()中调用setArguments()并传递给Fragment/FragmentActivity?
咱们先逐个解答你的两个技术疑问,再针对性解决你遇到的参数为null的问题:
1. 能在onActivityResult()中调用setArguments()给Fragment传参吗?
当然可以,但要注意一个核心前提:必须给刚创建、还没被添加到Activity的Fragment实例调用setArguments()。
setArguments()本来就是用来给Fragment传递初始化参数的,一旦Fragment通过FragmentTransaction的add()/replace()方法被添加到Activity,再调用这个方法就会直接抛出异常。你代码里创建ProductListFragment实例后立刻设置arguments的做法是完全正确的,这部分逻辑没问题。
2. 能在onActivityResult()中调用setArguments()给FragmentActivity传参吗?
不行哦,因为FragmentActivity(包括咱们常用的AppCompatActivity)根本没有setArguments()和getArguments()这两个方法——这俩是Fragment类独有的API。
如果要给FragmentActivity传递数据,得用Activity的Intent机制,或者把数据存到savedInstanceState里,别用Fragment的arguments那套逻辑。
解决你遇到的“FragmentActivity获取参数为null”问题
从你的代码描述来看,你大概率是混淆了Fragment和FragmentActivity的API用法,分两种情况给你解决方案:
情况1:你误在FragmentActivity(比如FirstActivity)的onCreate()里调用getArguments()
如果是这种情况,直接换一种获取数据的方式就行:
你是在onActivityResult()里拿到返回数据的,可以把这些数据存成Activity的成员变量,后续需要的时候直接用就行。比如:
// FirstActivity的成员变量 private String SORT_VALUE; private String SORT_BY; @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == SORT_RESULT && resultCode == RESULT_OK && data != null && data.getExtras() != null) { Bundle bundle = data.getExtras(); // 把返回数据存为Activity成员变量 SORT_VALUE = bundle.getString("SORT_VALUE"); SORT_BY = bundle.getString("SORT_BY"); // ...处理其他逻辑 } }
情况2:你其实是在ProductListFragment的onCreate()里调用getArguments()但返回null
这说明你设置了arguments的Fragment实例根本没被正确添加到Activity中。你现在的代码只创建了Fragment并设置了参数,但缺少了把这个实例替换/添加到Activity的关键步骤。
你需要补充FragmentTransaction的代码,比如:
// 在FirstActivity的onActivityResult()中,设置完arguments后添加这段代码 getSupportFragmentManager() .beginTransaction() .replace(R.id.fragment_container, frg) // 这里替换成你布局里的Fragment容器ID .commit();
这样一来,当ProductListFragment被添加到Activity后,它的onCreate()方法里调用getArguments()就能正确拿到你设置的参数了。另外要注意:每次需要传递新参数时,都要创建新的Fragment实例并设置arguments,别复用旧的实例哦。
内容的提问来源于stack exchange,提问作者rereh

