You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fragment间传递整数数据失败,已尝试多种方案仍未解决

问题:Fragment间通过Navigation组件传递Bundle时,目标Fragment的getArguments()始终返回null

问题场景

尝试在两个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传递时的键名拼写错误等问题:

    1. 在app模块的build.gradle中添加插件:
      id 'androidx.navigation.safeargs' // Java项目
      // Kotlin项目使用 id 'androidx.navigation.safeargs.kotlin'
      
    2. 在导航图中给serviceDetailFragment添加argument:
      <fragment
          android:id="@+id/serviceDetailFragment"
          android:name="com.yourpackage.ServiceDetailFragment">
          <argument
              android:name="Id"
              app:argType="integer" />
      </fragment>
      
    3. Fragment1中跳转代码改为:
      ServiceDetailFragmentDirections.ActionToServiceDetailFragment action = 
          ServiceDetailFragmentDirections.actionToServiceDetailFragment(1);
      navController.navigate(action);
      
    4. Fragment2中获取参数:
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          ServiceDetailFragmentArgs args = ServiceDetailFragmentArgs.fromBundle(requireArguments());
          serviceId = args.getId();
      }
      

内容的提问来源于stack exchange,提问作者Denis De Pauli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 21:47:33