使用NavigationUI实现菜单跳转时向目标Fragment传递数据的方法咨询
解决方案
针对NavigationUI结合Bundle传参的需求,以下是两种常用的可行实现方式:
方案1:手动处理指定菜单项跳转(最直接)
默认的NavigationUI.onNavDestinationSelected方法不会携带自定义参数,你可以先判断点击的菜单项ID,手动调用navigate方法传入Bundle,剩余菜单项再走默认逻辑即可。
修改后的onOptionsItemSelected代码如下:
@Override public boolean onOptionsItemSelected(MenuItem item) { int itemId = item.getItemId(); Bundle bundle = new Bundle(); // 根据点击的菜单项设置对应参数 if (itemId == R.id.菜单1ID) { // 替换为你menu文件里第一个菜单项的id,需和导航图中目标/action id一致 bundle.putString("help_title", "对应标题1"); bundle.putString("help_desc", getResources().getString(R.string.pBasics_desc)); bundle.putString("help_image", "basic"); navController.navigate(itemId, bundle); return true; } else if (itemId == R.id.菜单2ID) { // 替换为第二个菜单项id bundle.putString("help_title", "对应标题2"); // 填入其余对应参数 navController.navigate(itemId, bundle); return true; } else if (itemId == R.id.菜单3ID) { // 替换为第三个菜单项id bundle.putString("help_title", "对应标题3"); // 填入其余对应参数 navController.navigate(itemId, bundle); return true; } // 非目标菜单项走默认导航逻辑 return NavigationUI.onNavDestinationSelected(item, navController) || super.onOptionsItemSelected(item); }
配套优化建议
建议把导航图中定义的参数从action节点下移到LauncherFragment的根节点下,这样不管从哪个路径跳转至该Fragment都可以正常传参,避免参数仅对当前action生效的问题:
<fragment android:id="@+id/LauncherFragment" android:name="com.example.ptimer.LauncherFragment" android:label="Launcher" tools:layout="@layout/fragment_launcher"> <argument android:name="help_title" app:argType="string" android:defaultValue="@null" /> <argument android:name="help_desc" app:argType="string" android:defaultValue="@null" /> <argument android:name="help_image" app:argType="string" android:defaultValue="@null" /> </fragment>
方案2:使用Safe Args插件(类型更安全)
如果不想手写参数key避免拼写错误,可以开启官方的Safe Args插件,生成类型安全的导航类,用法如下:
- 项目级build.gradle添加插件依赖
- 模块级build.gradle应用插件
- 跳转时直接用生成的方向类传参:
// 对应菜单项点击时调用 LauncherFragmentDirections.ActionHelpFragmentToLauncherFragment direction = HelpFragmentDirections.actionHelpFragmentToLauncherFragment( "标题内容", getResources().getString(R.string.pBasics_desc), "basic" ); navController.navigate(direction);
目标Fragment接收参数时直接调用:
LauncherFragmentArgs args = LauncherFragmentArgs.fromBundle(getArguments()); String title = args.getHelpTitle(); String desc = args.getHelpDesc(); String image = args.getHelpImage();
目标Fragment参数接收
如果不使用Safe Args,直接在目标Fragment的onViewCreated中接收即可:
@Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); Bundle args = getArguments(); if (args != null) { String title = args.getString("help_title"); String desc = args.getString("help_desc"); String image = args.getString("help_image"); // 执行后续UI渲染等逻辑 } }
内容的提问来源于stack exchange,提问作者BMG
相关产品推荐
相关产品推荐

