【问题标题】:Passing data to fragments while using NavigationUI在使用 NavigationUI 时将数据传递给片段
【发布时间】:2022-01-07 03:22:12
【问题描述】:

我是 Android 编程新手。我经常得到 SO 的帮助。

我在工具栏菜单中有三个项目,并且基于对菜单项的选择,应用程序会遍历相关片段。我想将数据传递给片段。根据 SO 和 Android 官方网站中的信息,我在导航图中创建了参数并在 Main 活动中设置了值。但我不知道如何将它与 NavigationUI 一起使用。

导航图如下:

    <fragment
        android:id="@+id/helpFragment"
        android:name="com.example.ptimer.HelpFragment"
        android:label="About"
        tools:layout="@layout/fragment_help">
        <action
            android:id="@+id/action_helpFragment_to_LauncherFragment"
            app:destination="@id/LauncherFragment">
            <argument
                android:name="help_title"
                app:argType="string" />
            <argument
                android:name="help_desc"
                app:argType="string" />
            <argument
                android:name="help_image"
                app:argType="string" />
        </action>
    </fragment>

主要活动方式如下:

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

            Bundle bundle = new Bundle();
            bundle.putString("help_title", help_title);
            bundle.putString("help_desc", getResources().getString(R.string.pBasics_desc));
            bundle.putString("help_image", "basic");

        return NavigationUI.onNavDestinationSelected(item, navController)
                || super.onOptionsItemSelected(item);
    }

我希望您能帮助我了解如何在 NavationUI 中使用捆绑包。或者有没有其他方法可以在选择菜单时将数据传递给片段。

【问题讨论】:

    标签: android android-fragments


    【解决方案1】:

    我可以看到您已经创建了一个捆绑对象,但您在传递数据时没有在任何地方使用它。 我建议您使用SafeArgs,因为您已经在使用Navigation Component

    您需要为安全的 args 添加一些依赖项,但是一旦添加,它将非常简单。一旦您添加任何方向,就会生成一个方向类,并且它需要参数(如果您的图表中提到了任何参数)

    您可以获取安全参数here的详细解释和示例。

    无论如何,如果您仍想使用 bundle 传递数据,那么您可以查看here

    您应该使用:-

    ,而不是使用 OnOptionsItemSelected
     override fun onNavigationItemSelected(item: MenuItem): Boolean {
            when (item.itemId) {
                R.id.YourItemId -> {
                    yourNavController.navigate(YourDirections.yourAction())
                }
                else -> navController.navigate(item.itemId)
            }
            return true
        }
    

    【讨论】:

    • 哈尼夫,感谢您的指导。但是由于代码处于活动状态,因此无法弄清楚如何在 Navigation.findNavController(view).navigate(action); 中传递视图。我尝试在主要活动中查看主页片段并得到运行时错误。
    • 你能在哪里添加导航代码吗?
    • 代码来自 MainActivity ` @Override public boolean onOptionsItemSelected(MenuItem item) { if (item.getItemId() == R.id.helpFragment) { LFDirections.PassData action = LFDirections.passData(); action.setHelpTitle("Mahat"); Navigation.findNavController(view).navigate(action); } 返回 NavigationUI.onNavDestinationSelected(item, navController) || super.onOptionsItemSelected(item); }`
    • @BMG 我已经更新了我的答案
    • @Hanif,出现onNavigationItemSelected() 未在超类中覆盖的错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多