Fragment间传递整数数据失败,已尝试多种方案仍未解决
问题场景
尝试在两个Fragment间通过Bundle传递整数值,Fragment1中已正确实例化Bundle并设置值,但Fragment2中调用getArguments()得到的Bundle始终为null。
Fragment1代码:
Bundle n = new Bundle(); n.putInt("Id", 1); // test value NavController navController = Navigation.findNavController(getActivity(), R.id.nav_host_fragment_content_main); navController.navigate(R.id.serviceDetailFragment, n);
Fragment2代码:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle b = getArguments(); if (b != null) { serviceId = b.getInt("Id"); } }
可能的解决步骤
核对导航图配置
确认nav_graph.xml中目标Fragment的id是serviceDetailFragment,和你调用navController.navigate()时传入的id完全一致。如果id不匹配,导航会走错误路径,参数自然无法传递。验证NavHostFragment的id正确性
检查Navigation.findNavController()中传入的R.id.nav_host_fragment_content_main是否是布局中正确的NavHostFragment的id。如果这个id写错,获取到的NavController不属于当前导航栈,参数传递会失效。检查Fragment的实例创建逻辑
确保Fragment2没有被其他代码(比如手动调用newInstance())创建并添加到栈中,这种情况下Navigation组件传递的参数不会被设置到Fragment实例上。必须完全通过NavController的navigate()方法跳转,才能保证参数被正确传递。改用Safe Args传递参数(推荐)
Safe Args是Navigation组件提供的类型安全参数传递方案,能避免Bundle传递时的键名拼写错误等问题:- 在app模块的build.gradle中添加插件:
id 'androidx.navigation.safeargs' // Java项目 // Kotlin项目使用 id 'androidx.navigation.safeargs.kotlin' - 在导航图中给
serviceDetailFragment添加argument:<fragment android:id="@+id/serviceDetailFragment" android:name="com.yourpackage.ServiceDetailFragment"> <argument android:name="Id" app:argType="integer" /> </fragment> - Fragment1中跳转代码改为:
ServiceDetailFragmentDirections.ActionToServiceDetailFragment action = ServiceDetailFragmentDirections.actionToServiceDetailFragment(1); navController.navigate(action); - Fragment2中获取参数:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ServiceDetailFragmentArgs args = ServiceDetailFragmentArgs.fromBundle(requireArguments()); serviceId = args.getId(); }
- 在app模块的build.gradle中添加插件:
内容的提问来源于stack exchange,提问作者Denis De Pauli
相关产品推荐
相关产品推荐

