所以我在当前应用中的模块具有这种结构。
我还没有找到有关多模块导航的任何官方文档,但是我发现了关于此的article,所以这是我的gradle文件的方式:
功能1-详细信息
...
implementation project(":base")
implementation project(":feature-2-detail")
...
功能2-详细信息
...
implementation project(":base")
implementation project(":feature-1-detail")
...
功能3-详细信息
...
implementation project(":base")
implementation project(":feature-1-detail")
...
这是我的导航图:
功能1-详细信息
<navigation ...
android:id="@+id/graph_feature_1_id">
<include app:graph="@navigation/graph_feature_2" />
<fragment ...
android:id="@+id/nav_feature_1">
<action ...
app:destination="@+id/graph_feature_2_id" />
</fragment>
</navigation>
功能2-详细信息
<navigation ...
android:id="@+id/graph_feature_2_id">
<include app:graph="@navigation/graph_feature_1" />
<fragment ...
android:id="@+id/nav_feature_2">
<action ...
app:destination="@+id/graph_feature_1_id" />
</fragment>
</navigation>
功能3-详细信息
<navigation ...
android:id="@+id/graph_feature_3_id">
<include app:graph="@navigation/graph_feature_1" />
<fragment ...
android:id="@+id/nav_feature_3">
<action ...
app:destination="@+id/graph_feature_1_id" />
</fragment>
</navigation>
因此,所有设置都适用于这种设置,但是这里的问题是要将模块连接到另一个模块,我们必须将另一个功能添加为对当前功能的依赖。就像我的情况一样,功能1-详细信息可以转到功能2-详细信息,反之亦然,这样做使我有了循环依赖。
还有另一种方法可以进行多模块导航吗?我尝试使用深层链接,但无济于事。
任何帮助将不胜感激!谢谢!
答案 0 :(得分:6)
这已经一年了,但是库现在可以支持这个确切的用例!从2.1.0-alpha03开始,我们可以浏览深层链接URI。
我们无需将功能作为实现细节彼此添加,而是可以让它们之间不知道并使用深度链接导航。
功能1-详细信息-build.gradle
dependencies {
implementation project(':base')
}
与功能2-详细信息相同。无需知道其他模块。
要进行模块间导航,我们首先必须定义一个深层链接,以通过deepLink
标签在该目的地中进行导航。
功能1-详细信息-导航图
<navigation ...
android:id="@+id/graph_feature_1_detail_id">
<fragment ...
android:id="@+id/nav_feature_1_detail">
<deepLink app:uri="myApp://feature1detail"/>
</fragment>
</navigation>
功能2-详细信息-导航图
<navigation ...
android:id="@+id/graph_feature_2_detail_id">
<fragment ...
android:id="@+id/nav_feature_2_detail">
<deepLink app:uri="myApp://feature2detail"/>
</fragment>
</navigation>
现在我们已经设置了URI的深层链接,我们可以直接在NavController
因此,在功能1-详细信息中的片段中,也许只需单击一下按钮?您必须执行导航的任何地方
class Feature1DetailFragment {
fun onViewCreated(...) {
...
view.setOnClickListener {
val uri = Uri.parse("myApp://feature2detail")
findNavController().navigate(uri)
}
}
}
在功能2-详细信息中,
class Feature2DetailFragment {
fun onViewCreated(...) {
...
view.setOnClickListener {
val uri = Uri.parse("myApp://feature1detail")
findNavController().navigate(uri)
}
}
}
瞧!模块间导航。
在撰写本文时,最新的稳定版本是2.1.0-rc01
。
尽管我还没有在更复杂的项目上尝试过这一点,但我喜欢这个库,并且希望看到这个库更加成熟!
我为此创建了一个Medium article。您可以看一下。干杯!
答案 1 :(得分:0)
当您在基本要素中显式声明每个要素导航图ID时,可以删除所有Gradle要素间依赖关系。我对这种解决方案并不满意,因为这些ID会创建“隐藏的”功能间依赖关系,但否则效果很好。
以下是此设置的关键部分:
:应用
build.gradle
dependencies {
implementation project(':features:feature-base')
implementation project(':features:feature-one')
implementation project(':features:feature-two')
}
:功能:基于功能的
build.gradle
dependencies {
application project(':app')
feature project(':features:feature-one')
feature project(':features:feature-two')
}
navigation / feature_base_nav_graph.xml
<navigation ...>
<include app:graph="@navigation/feature_one_nav_graph" />
<include app:graph="@navigation/feature_two_nav_graph" />
</navigation>
values / feature_base_ids.xml
<resources>
<item name="feature_one_nav_graph" type="id" />
<item name="feature_two_nav_graph" type="id" />
</resources>
:功能:功能一
build.gradle
dependencies {
implementation project(':features:feature-base')
}
navigation / feature_one_nav_graph.xml
<navigation
android:id="@id/feature_one_nav_graph"
...>
<fragment
android:id="@+id/oneFragment"
...>
<action
android:id="@+id/navigateToFeatureTwo"
app:destination="@id/feature_two_nav_graph"
... />
</fragment>
</navigation>
导航
findNavController().navigate(R.id.navigateToFeatureTwo)
:功能:功能二
build.gradle
dependencies {
implementation project(':features:feature-base')
}
navigation / feature_two_nav_graph.xml
<navigation
android:id="@id/feature_two_nav_graph"
...>
<fragment
android:id="@+id/twoFragment"
...>
<action
android:id="@+id/navigateToFeatureOne"
app:destination="@id/feature_one_nav_graph"
... />
</fragment>
</navigation>
导航
findNavController().navigate(R.id.navigateToFeatureOne)
答案 2 :(得分:0)
一种可能有用的方法是创建一个全新的独立模块(例如“:navigation”模块),并将所有navigation.xml文件从所有其他模块移至该模块。然后,在需要导航相关内容的所有其他模块中,我们依靠新的(“:navigation”)模块,我们将能够访问其R.navigation或生成的参数类,等等。
由于新的(“:navigation”)模块对项目中的其他内容一无所知,因此我们会将Navigation.xml文件中使用的任何片段,活动和其他类标记为红色,这些片段,活动和其他类在其他模块之外进行了定义只要我们使用完整的类名(com.exampel.MyFragment),它就会编译并起作用。
<?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"
android:id="@+id/nav_graph_id"
app:startDestination="@id/some_navigation_id">
<fragment
android:id="@+id/some_navigation_id"
android:name="com.exampel.MyFragment".../>
// com.exampel.MyFragment will be marked red since IDE can't link it
// to the existing class because it is in the other module
这将以我们需要知道类名和潜在参数的方式对要导航的所有类创建“隐藏”依赖关系,我们必须手动维护它,但它允许我们轻松地在独立模块中分离导航。