我是导航图新手,我有一个简单的电影应用程序,其中包含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(使用前将#替换为@)