在 Android Kotlin 中从另一个导航图中的一个目的地导航到另一个目的地

2023-12-30

我是导航图新手,我有一个简单的电影应用程序,其中包含BottomNavigationView有 2 个选项卡或 2 个图标,第一个图标或第一个选项卡包含 2Fragments第一个是FeedFragment我从它导航到DetailsFragment我把这 2 个Fragment in nested graph。第二个选项卡为FavoritFragment .

在我的代码下面nav_graph.xml

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/my_nav"
    app:startDestination="@id/homeNavigation">


    <fragment
        android:id="@+id/favoritesFragment"
        android:name="com.tito.movieapps.ui.fragments.FavoritesFragment"
        android:label="@string/favorites"
        tools:layout="@layout/fragment_favorites" >

        <action
            android:id="@+id/action_favoritesFragment_to_homeNavigation"
            app:destination="@id/detailsFragment" />
    </fragment>
    <navigation
        android:id="@+id/homeNavigation"
        android:label="Home nested graph"
        app:startDestination="@id/feedFragment">
        <fragment
            android:id="@+id/feedFragment"
            android:name="com.tito.movieapps.ui.fragments.FeedFragment"
            android:label="@string/feed_page"
            tools:layout="@layout/fragment_feed">
            <action
                android:id="@+id/action_feedFragment_to_detailsFragment"
                app:destination="@id/detailsFragment" />

        </fragment>
        <fragment
            android:id="@+id/detailsFragment"
            android:name="com.tito.movieapps.ui.fragments.DetailsFragment"
            android:label="Details"
            tools:layout="@layout/fragment_details">
            <argument
                android:name="movieItem"
                app:argType="com.tito.domain.entites.MovieModelItem" />
        </fragment>
    </navigation>

</navigation>

我可以从FeedFragment to DetailsFragment我通过了Parcelable目的 。 我想从FavoriteFragment to DetailsFragment(在嵌套的navigationGraph)并且当我在中编写以下代码时FavoriteFragment

lifecycleScope.launchWhenStarted {
            detailsViewModel.getSavedMovie().collectLatest { movies->
               if(movies.isNotEmpty()) {
                   favoritesAdapter = FavoritesAdapter(object : FavoritesAdapter.OnItemClick{
                       override fun onItemClick(movieModelItem: MovieModelItem) {

                           val id = FavoritesFragmentDirections.actionFavoritesFragmentToHomeNavigation(movieModelItem)

                            findNavController().navigate(id)
                       }
                   })
                   binding.movieRec.adapter = favoritesAdapter
                   favoritesAdapter.differ.submitList(movies)
               }else{
                   Toast.makeText(requireActivity(),"No data",Toast.LENGTH_LONG).show()
               }
            }
        }

并运行该应用程序,我无法运行它,出现以下错误

e: D:\MovieApps\app\src\main\java\com\tito\movieapps\ui\fragments\FavoritesFragment.kt: (48, 105): Too many arguments for public final fun actionFavoritesFragmentToHomeNavigation(): NavDirections defined in com.tito.movieapps.ui.fragments.FavoritesFragmentDirections.Companion

我无法修复这个错误,所以请帮助我


我不知道你的项目的完整代码,所以,我只能建议一个技巧(这是一个非标准的临时解决方案)。

Add an Boolean论证例如shouldIGo和一个可为空的变量movieItemData进入你的homeNavigation。我的技巧是这样的,如果有人进入这个homeNavigation with ShouldIGo == true(当然在这种情况下movieItemData必须为非空并附加到方向)然后 自动导航到DetailsFragment有了这些额外的数据。

<navigation
    android:id="@+id/homeNavigation"
    android:label="Home nested graph"
    app:startDestination="@id/feedFragment">
    <fragment
        android:id="@+id/feedFragment"
        android:name="com.tito.movieapps.ui.fragments.FeedFragment"
        android:label="@string/feed_page"
        tools:layout="@layout/fragment_feed">
        <action
            android:id="@+id/action_feedFragment_to_detailsFragment"
            app:destination="@id/detailsFragment" />

        <argument <!-- this has been added -->
            android:name="movieItemData"
            app:argType="com.tito.domain.entites.MovieModelItem"
            android:defaultValue="@null"
            app:nullable="true"/>
        <argument <!-- this has been added -->
            android:name="shouldIGo"
            app:argType="boolean"
            android:defaultValue="false"/>

    </fragment>
    <fragment
        android:id="@+id/detailsFragment"
        android:name="com.tito.movieapps.ui.fragments.DetailsFragment"
        android:label="Details"
        tools:layout="@layout/fragment_details">
        <argument
            android:name="movieItem"
            app:argType="com.tito.domain.entites.MovieModelItem" />
    </fragment>
</navigation>

在家庭片段中homeNavigation, i.e. FeedFragment检查是否shouldIGo是真是假。如果这是真的然后导航到detailsFragment.

private FeedFragmentArgs args;

...

onCreate ... 

args = FeedFragmentArgs.fromBundle(requireArguments());

if (args.shouldIGo == true) {
//navigate to detailsFragment with movieItemData data.
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Android Kotlin 中从另一个导航图中的一个目的地导航到另一个目的地 的相关文章

  • 64位版本的adb和fastboot?

    我在 Debian 7 3 x64 已完全修补 上发现了以下错误 我很确定这是因为adb即使在其 SDK 工具的 64 位发行版中也是 32 位 which adb opt android sdk platform tools adb op
  • 在Android中,哪种布局更快 1. LinearLayout内的FrameLayout还是2. 一大RelativeLayout?

    我正在考虑视图的两种不同布局安排 这将是 RecyclerView 中的一行 它们是不同的 但它们都可以工作 或者作为 一个容器垂直 LinearLayout 包含多行 FrameLayout 例如LinearLayout gt Frame
  • Kotlin Android Studio - Var 在 SDK 29 中被视为 val

    我在 Kotlin 中遇到了一件非常奇怪的事情 我有 var myClipboard getSystemService CLIPBOARD SERVICE as ClipboardManager var myClip ClipData Cl
  • android 无法解析方法 setcontentview

    今天在android studio 中遇到了一个错误 我正在尝试在应用程序中创建一个关于我们的屏幕 布局 xml 文件已创建 任何帮助表示赞赏 谢谢 错误 无法解析方法 setcontentview int package example
  • 如何在android.mk文件中指定c头文件

    我有一个 c 源文件夹名称 clib 其中 我有一些示例文件 例如 1 h 1 c 2 h 2 c 3 c 3 h 在该文件夹之外我有 4 个 h 4 c 4 jni h 4 jni c 现在为了构建 so 我创建了像这样的 android
  • 使用actionBar推送视图的正确方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我是一名新的 Android 开发人员 所以我更喜欢询问正确的方法来解决我的问题 我有一个 FragmentActivity 和多个片段
  • Kotlin 扩展函数 - 覆盖现有方法

    是否可以做类似的事情 Converts all of the characters in the string to upper case param str the string to be converted to uppercase
  • 在原生 Android 应用程序中集成多个 Unity 游戏

    我有一个原生 Android 应用程序 我想在其中嵌入多个 Unity 游戏 我跟着link https medium com davidbeloosesky embedded unity within android app 7061f4
  • 在 RecyclerView 中自动调整 TextView 大小会导致文本大小减小

    我正在尝试使用自动调整文本视图大小 https developer android com guide topics ui look and feel autosizing textview在 RecyclerView 中 但是当我滚动几次
  • 在一天中的特定时间设置闹钟

    我正在尝试将闹钟设置在一天中的特定时间 例如 20 15 这是我正在使用的代码 但它不会在 20 15 关闭 Intent intent new Intent AlarmActivity this MyBroadcastReceiver c
  • 在 Android 上解析 RSS

    我有几个 RSS 源需要为我的应用程序进行解析 我按照这里的优秀教程进行操作 http w2davids wordpress com android rssatom feeds parsing with rome http w2davids
  • 使用 Gradle 构建 Kotlin + Java 9 项目

    我对 Gradle 老实说 还有 Java 9 相当陌生 我正在尝试使用 Gradle 构建一个混合了 Java 9 和 Kotlin 的简单库项目 更详细地说 Java中有一个接口 Kotlin中有一个实现 我会用 Kotlin 做所有事
  • 在 Android 中将图像从可绘制图像转换为字节数组

    由于我要将图像发送到 Parse com 因此我必须将其转换为字节数组 我的第一种方法是从图库中选择图像并将其转换为字节数组 如下所示 Override protected void onActivityResult int request
  • @android的含义

    我想问一下是什么意思 android as in android id android id list 我在不同的 android 示例和教程中看到过它 我也用谷歌搜索过它 我发现的唯一解释是 列表和空 ID 是由 Android 平台为我
  • TextView 中缩进项目符号列表

    我有一个 TextView 我用 strings xml 中的字符串资源中的文本填充它 字符串资源包含 元素 用于在 TextView 内创建项目符号列表 我的问题是我想控制项目符号列表中跨越多行的行的缩进 默认情况下 文本不会缩进超过项目
  • 解析JSON数据并将其放入gridview中

    我正在开发一个应用程序 我必须在其中解析JSON数据并且必须将它们放入自定义中gridview 它应该是这样的 到目前为止 我已经在 asynctask 中解析了 JSON 数据并获取了这些值 这是我的代码 private class ge
  • 只需更新一个小部件 RemoteViews 而不是完全创建一个新小部件?

    在 AppWidgetProvider 类的 onUpdate 方法中 我最终执行了大量代码 以便我可以完全重新创建一个新的 RemoteView 对象 现实是 每次更新时 我实际上只需要在 RemoteView 中的 TextView 之
  • 如何在两种不同模式、两种布局中设置方向?

    我有一个叫做Main XML我将方向设置为纵向AndroidManifest xml 我也为 Honeycomb 设计了这个布局并将其放置在layout xlarge mdpi文件夹 但我想使用Main XML in layout xlar
  • 在 Android(JB 上)中,如何向自定义丰富通知添加操作?

    我一直在使用 Jelly Bean 中新的丰富通知 当我使用模板设置新通知时 一切都按预期工作Notification BigPictureStyle Notification BigTextStyle or Notification In
  • 在活动之间共享菜单栏

    我的应用程序上有一个菜单栏 我需要在 5 个活动之间共享该菜单栏 我的菜单栏 5 个允许在活动之间切换的按钮 对于任何活动具有完全相同的 UI 和相同的行为 因此我想共享菜单栏 XML 视图代码和控制器代码 我已经找到了一种使用共享 XML

随机推荐