11

我正在尝试在启用了安全参数的不同导航图中重用一个片段。我注意到如果操作不同,我会收到编译错误。这是因为xxxFragmentDirections自动生成的代码只会生成其中一个动作。

nav_graph_1.xml

<navigation 
  ...
  <fragment
    android:id="@+id/myFragment"
    android:name="com.example.android.MyFragment">
    <action
      android:id="@+id/next_action"
      app:destination="@+id/dest_one" />
  </fragment>
  ...

nav_graph_2.xml

<navigation 
  ...
  <fragment
    android:id="@+id/myFragment"
    android:name="com.example.android.MyFragment">
    <action
      android:id="@+id/other_action"
      app:destination="@+id/other_dest" />
  </fragment>
  ...

一个简单的用例:一个银行应用程序有两个流程:提款和存款,因此您可以有两个导航图。你可以有一个AmountFragment你可以输入一个数字的地方,这个数字可以重复用于提款或存款。但是,根据流程,操作/目的地可能会有所不同。

那么,如何重用这个片段呢?

4

3 回答 3

4

将 navigate() 与 bundle 一起使用,而不是在极端情况下使用操作。不要打电话

findNavController().navigate(FragmentDirections.goToDetailFragment(id))

而是使用

findNavController().navigate(R.id.DetailFragment, bundleOf("id" to 5))

这样您就不必依赖生成的方向,但仍然可以使用 DetailFragment 的 Navigation 和 SafeArgs 功能。

https://code.allaboutapps.at/articles/android-jetpack-navigation-pitfalls/#reuse-fragments-in-multiple-navigation-graphs

于 2020-04-14T08:50:50.577 回答
3

这可以通过在两个导航图中提供相同的操作 ID 来实现。

在 nav_graph_1.xml 中:

<navigation 
  ...
  <fragment
    android:id="@+id/myFragment"
    android:name="com.example.android.MyFragment">
    <action
      android:id="@+id/next_action"
      app:destination="@+id/dest_one" />
  </fragment>
  ...

在 nav_graph_2.xml 中:

<navigation 
  ...
  <fragment
    android:id="@+id/myFragment"
    android:name="com.example.android.MyFragment">
    <action
      android:id="@+id/next_action"
      app:destination="@+id/other_dest" />
  </fragment>
  ...

在片段中,导航可以像这样执行

NavHostFragment.findNavController(<myFragment>).navigate(R.id.next);

于 2020-12-08T09:50:13.720 回答
0

这可能不是您所要求的,但我遇到了我在不同导航图中需要的片段中代码的可重用性问题。

需要复用的片段类需要声明为抽象类:

abstract class ReusableFragment(val type: ReusableEnum): Fragment(){
    enum class ReusableEnum{Type1, Type2}
    // the rest of your logic will use 
    // 'type' variable in when() blocks to determine 
    // specific logic for each case
}

class Type1Fragment: ReusableFragment(ReusableEnum.Type1)
class Type2Fragment: ReusableFragment(ReusableEnum.Type2)

这样,Type1FragmentType2FragmentNavigationGraph 中可以作为独立图使用。

于 2021-04-17T06:19:13.287 回答