如何让Android导航组件的Destination在不同的Destinations中膨胀而不被编辑,就好像它们是共享实例一样?
How To Make Destination of Android Navigation Component Inflated in Different Destinations Not Be Edited as If They Were Shared Instances?
情景:
我在我的应用设置中使用 BottomNavigationView 组件和 Android 导航组件。这是一款社交网络应用程序,包含 Home、Feed、Challenges、Map 和 Profile 作为应用程序的主要目的地。有 2 个目的地(destination_feed 和 destination_profile) 在其中使用第三个目的地 (navigation_graph_posts)。下图大致显示了场景:
问题:
当我访问destination_profile(仅显示登录用户的帖子)并返回destination_feed, destination_feed[=91上显示的帖子=](以前都是帖子)现在只显示 destination_profile 上显示的相同帖子。我对 profile_destination 的帖子所做的更改似乎反映在 [=66= 的帖子中]feed_destination.
我认为问题是默认情况下,Android 导航组件使用选项 launchSingleTop 将导航图目的地膨胀为 TRUE但我找不到如何将其更改为 FALSE 因为 destination_posts 是Posts_navigation_graph 和 [ 的 StartDestination =146=] 在 destination_feed 和 [ 中以编程方式膨胀=66=]destination_profile。在我使用的代码下方(减少到重要的部分):
feed_navigation.xml
<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/feed_navigation"
app:startDestination="@id/destination_feed">
<fragment
android:id="@+id/destination_feed"
android:name="com.jonathan.maxplore.screen.feed.view.FeedFragment"
android:label="@string/fragment_label_feed"
tools:layout="@layout/fragment_feed">
<argument
android:name="showBottomNavigation"
android:defaultValue="true" />
</fragment>
</navigation>
profile_navigation.xml
<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/profile_navigation"
app:startDestination="@id/destination_profile">
<fragment
android:id="@+id/destination_profile"
android:name="com.jonathan.maxplore.screen.profile.view.ProfileFragment"
android:label="@string/fragment_label_profile"
tools:layout="@layout/fragment_profile">
<argument
android:name="showBottomNavigation"
android:defaultValue="true" />
</fragment>
</navigation>
posts_navigation.xml
<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/posts_navigation"
app:startDestination="@id/destination_posts">
<fragment
android:id="@+id/destination_posts"
android:name="com.jonathan.maxplore.screen.posts.view.PostsFragment"
android:label="@string/fragment_label_posts"
tools:layout="@layout/fragment_posts">
<argument
android:name="showAppBar"
android:defaultValue="true" />
<argument
android:name="mode"
app:argType="com.jonathan.maxplore.util.PostsMode"/>
<argument
android:name="identifier"
android:defaultValue="0L"
app:argType="long"/>
</fragment>
</navigation>
fragment_feed.xml
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragment_feed_content"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
app:defaultNavHost="true"/>
fragment_profile.xml
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragment_profile_content"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
app:defaultNavHost="true"/>
FeedFragment.kt
val extras = arguments
extras?.putSerializable(ConstantsUtil.Extras.EXTRA_POSTS_MODE, PostsMode.GLOBAL)
extras?.putBoolean(ConstantsUtil.Extras.EXTRA_BOTTOM_NAVIGATION_ACCESS, true)
val navHostFragment = (childFragmentManager.findFragmentById(R.id.fragment_feed_content) as NavHostFragment)
val navGraph = navHostFragment.navController.navInflater.inflate(R.navigation.posts_navigation)
navHostFragment.navController.setGraph(navGraph, extras)
ProfileFragment.KT
val extras = arguments
extras?.putSerializable(ConstantsUtil.Extras.EXTRA_POSTS_MODE, PostsMode.MINE)
extras?.putBoolean(ConstantsUtil.Extras.EXTRA_BOTTOM_NAVIGATION_ACCESS, true)
val navHostFragment = (childFragmentManager.findFragmentById(R.id.fragment_profile_content) as NavHostFragment)
val navGraph = navHostFragment.navController.navInflater.inflate(R.navigation.posts_navigation)
navHostFragment.navController.setGraph(navGraph, extras)
非常感谢任何关于如何修复它或什至可能发生的其他事情的建议,以便我可以进一步调查它!提前谢谢你们!
我发现了问题。该问题与 Android 导航组件无关。我还使用 Paging 3,当我刷新帖子片段时,我删除了所有帖子并添加了我从后端收到的帖子的第一页。问题是,当打开用户配置文件时,我正在刷新帖子,这使得所有帖子都被删除,并且只将用户帖子添加到本地数据库中。然后当返回到 Feed 屏幕时,此时数据库中只有来自所选用户的帖子。
问题已解决。谢谢大家
情景:
我在我的应用设置中使用 BottomNavigationView 组件和 Android 导航组件。这是一款社交网络应用程序,包含 Home、Feed、Challenges、Map 和 Profile 作为应用程序的主要目的地。有 2 个目的地(destination_feed 和 destination_profile) 在其中使用第三个目的地 (navigation_graph_posts)。下图大致显示了场景:
问题:
当我访问destination_profile(仅显示登录用户的帖子)并返回destination_feed, destination_feed[=91上显示的帖子=](以前都是帖子)现在只显示 destination_profile 上显示的相同帖子。我对 profile_destination 的帖子所做的更改似乎反映在 [=66= 的帖子中]feed_destination.
我认为问题是默认情况下,Android 导航组件使用选项 launchSingleTop 将导航图目的地膨胀为 TRUE但我找不到如何将其更改为 FALSE 因为 destination_posts 是Posts_navigation_graph 和 [ 的 StartDestination =146=] 在 destination_feed 和 [ 中以编程方式膨胀=66=]destination_profile。在我使用的代码下方(减少到重要的部分):
feed_navigation.xml
<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/feed_navigation"
app:startDestination="@id/destination_feed">
<fragment
android:id="@+id/destination_feed"
android:name="com.jonathan.maxplore.screen.feed.view.FeedFragment"
android:label="@string/fragment_label_feed"
tools:layout="@layout/fragment_feed">
<argument
android:name="showBottomNavigation"
android:defaultValue="true" />
</fragment>
</navigation>
profile_navigation.xml
<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/profile_navigation"
app:startDestination="@id/destination_profile">
<fragment
android:id="@+id/destination_profile"
android:name="com.jonathan.maxplore.screen.profile.view.ProfileFragment"
android:label="@string/fragment_label_profile"
tools:layout="@layout/fragment_profile">
<argument
android:name="showBottomNavigation"
android:defaultValue="true" />
</fragment>
</navigation>
posts_navigation.xml
<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/posts_navigation"
app:startDestination="@id/destination_posts">
<fragment
android:id="@+id/destination_posts"
android:name="com.jonathan.maxplore.screen.posts.view.PostsFragment"
android:label="@string/fragment_label_posts"
tools:layout="@layout/fragment_posts">
<argument
android:name="showAppBar"
android:defaultValue="true" />
<argument
android:name="mode"
app:argType="com.jonathan.maxplore.util.PostsMode"/>
<argument
android:name="identifier"
android:defaultValue="0L"
app:argType="long"/>
</fragment>
</navigation>
fragment_feed.xml
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragment_feed_content"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
app:defaultNavHost="true"/>
fragment_profile.xml
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragment_profile_content"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
app:defaultNavHost="true"/>
FeedFragment.kt
val extras = arguments
extras?.putSerializable(ConstantsUtil.Extras.EXTRA_POSTS_MODE, PostsMode.GLOBAL)
extras?.putBoolean(ConstantsUtil.Extras.EXTRA_BOTTOM_NAVIGATION_ACCESS, true)
val navHostFragment = (childFragmentManager.findFragmentById(R.id.fragment_feed_content) as NavHostFragment)
val navGraph = navHostFragment.navController.navInflater.inflate(R.navigation.posts_navigation)
navHostFragment.navController.setGraph(navGraph, extras)
ProfileFragment.KT
val extras = arguments
extras?.putSerializable(ConstantsUtil.Extras.EXTRA_POSTS_MODE, PostsMode.MINE)
extras?.putBoolean(ConstantsUtil.Extras.EXTRA_BOTTOM_NAVIGATION_ACCESS, true)
val navHostFragment = (childFragmentManager.findFragmentById(R.id.fragment_profile_content) as NavHostFragment)
val navGraph = navHostFragment.navController.navInflater.inflate(R.navigation.posts_navigation)
navHostFragment.navController.setGraph(navGraph, extras)
非常感谢任何关于如何修复它或什至可能发生的其他事情的建议,以便我可以进一步调查它!提前谢谢你们!
我发现了问题。该问题与 Android 导航组件无关。我还使用 Paging 3,当我刷新帖子片段时,我删除了所有帖子并添加了我从后端收到的帖子的第一页。问题是,当打开用户配置文件时,我正在刷新帖子,这使得所有帖子都被删除,并且只将用户帖子添加到本地数据库中。然后当返回到 Feed 屏幕时,此时数据库中只有来自所选用户的帖子。
问题已解决。谢谢大家