当前位置: 首页 > 知识库问答 >
问题:

使用Android导航将数据传递回上一个片段

云宾鸿
2023-03-14

我已经开始使用Android架构组件(导航和安全参数、视图模型)以及Koin库。

目前,我在两个片段之间传递参数时遇到了一个问题——我需要将字符串值从片段a传递到片段B,在片段B中修改该值,然后将其传递回片段a。

我找到了一个解决问题的可能方法——共享视图模型。不幸的是,这种方法有一个问题,因为我可以在屏幕之间传递和修改值,但是当片段A导航到另一个目的地时,共享视图模型中的值仍然被存储并且没有被清除。

在Android导航中,在片段之间传递和修改数据有什么不同的解决方案吗?我希望避免手动清除这一值(当片段A被销毁时)。

共有3个答案

聂建茗
2023-03-14

你可以试试这个解决方案

<fragment
    android:id="@+id/a"
    android:name="...">

    <argument
        android:name="text"
        app:argType="string" />

    <action
        android:id="@+id/navigate_to_b"
        app:destination="@id/b" />

</fragment>

<fragment
    android:id="@+id/b"
    android:name="...">

    <argument
        android:name="text"
        app:argType="string" />

    <action
        android:id="@+id/return_to_a_with_arguments"
        app:destination="@id/a"
        app:launchSingleTop="true"
        app:popUpTo="@id/b"
        app:popUpToInclusive="true" />

</fragment>

和导航片段

NavHostFragment.findNavController(this).navigate(BFragmentDirections.returnToAWithArguments(text))

Ianhannbalake的评论帮助我解决了一个类似的问题

袁霍英
2023-03-14

目前,我在两个片段之间传递参数时遇到了一个问题——我需要将字符串值从片段a传递到片段B,在片段B中修改该值,然后将其传递回片段a。

理论上的解决方案实际上是将两个片段放在一个共享的

为了使这一点可靠,最好将导航标记的NavBackbackEntry同时用作ViewModelStoreOwner和SavedStateRegistryOwner,并创建一个AbstractSavedStateViewModelFactory,该工厂将使用ViewModelProvider创建ViewModel,同时还提供一个SavedStateHandle。

您可以使用此SavedStateHandle将结果从FragmentB传递到FragmentA,它与共享ViewModel相关联(范围为共享NavGraph)。

慕容兴贤
2023-03-14

Android刚刚发布了一个解决方案;在目的地之间传递数据(导航2.3.0-alpha02),基本上,在片段A中,您观察变量的变化,在片段B中,您在执行popBackStack()之前更改该值。

片段A:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
val navController = findNavController();
// We use a String here, but any type that can be put in a Bundle is supported
navController.currentBackStackEntry?.savedStateHandle?.getLiveData<String>("key")?.observe(
    viewLifecycleOwner) { result ->
    // Do something with the result.
  }
}

片段B:

navController.previousBackStackEntry?.savedStateHandle?.set("key", result)
navController.popBackStack()
 类似资料:
  • 问题内容: 我试图在我的应用程序的屏幕之间传递数据。目前我正在使用 我有我的index.js 应用为 然后在secondscreen.js中,我们将从前一个屏幕获取的数据作为 每当我console.log我得到未定义。 https://reactnavigation.org/docs/navigators/navigation- prop 文档说每个屏幕都应该具有这些值,我在做什么错呢? 问题答案

  • 是否可以使用底部导航视图和导航组件传递和访问片段中的参数? 我使用一个活动包含多个片段的方法,其中我的顶层片段需要一个参数(通常通过newInstance生成的方法完成)。我看过导航组件开发者指南和codelab,但是它只提到了使用safeargs和在目的地和动作中添加参数标签。 这是我的导航图: 底部导航视图菜单: 主要活动: activity_main.xml 家庭碎片

  • 我有两个活动,在活动1中有碎片,在活动2中有碎片 fragment1和fragment2扩展自FragmentActivity1,activity2扩展自AppCompatActivity 我想将字符串值从fragment1发送到fragment2,而不获取空值。我希望你能理解这个问题。谢谢

  • 我已经创建了导航抽屉活动,作为导航抽屉活动的更新新格式,根据新的Android架构,我用导航组件结构得到了它。 带有和的代码位于下方,当我单击任何导航项时,它正在打开片段。 这适用于nav\u host\u片段: 导航正在使用此 现在我想在调用时将一些值作为一个束(参数)在片段中传递。 场景:我有两个片段,分别是PrivacyPolicyFragment和TermsConditionsFragme

  • 我可以在D片段参数中设置所有六个arg,但在这种情况下,我应该在每个方向上传递所有六个变量。那么有没有其他的方法直接传递我想要的args在特定的方向上,然后在D片段中检索它

  • 在FragmentOne.class扩展android.support.v4.app.