多module(模块)使用Navigation功能

本文介绍了一种在Android应用中实现跨模块导航的方法,避免了模块间的直接依赖。通过定义通用的导航接口并使用资源ID进行导航文件定位,实现了不同模块间的顺畅跳转。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Navigation相信大家都熟悉,网上也有很多教程,但是很少有多Module切换的时候,要怎么使用的,用百度搜索了各种都没找到,后来用Google,一会就搜到了方法

思路是这样的:通过包名,导航文件,找到导航id,而不用module之间相互依赖

interface NavigationGraphRoute {

    val navigation: String
        get() = "navigation"

    var navGraph: NavGraph

    /**
    The .xml name for the nav-graph
     */
    val graphName: String

    /**
    The full package name where the nav-graph is located
     */
    val packageName: String

    /**
     * The navController
     */
    var localNavController:NavController

    fun addNavGraphDestination(
            navController: NavController,
            context:Context
    ): NavGraph {
        val navigationId =
                context.resources.getIdentifier(graphName,
                        navigation, packageName)

        val newGraph = navController.navInflater.inflate(navigationId)

        navController.graph.addDestination(newGraph)
        navGraph = newGraph
        localNavController = navController

        return newGraph
    }

    fun navigateTo() {
        localNavController.navigate(navGraph.id)
    }
}

这是基类,然后根据各种业务,写一写个性化定制:

class SecondFragmentRoute() : NavigationGraphRoute {

    /**
     * Contains the destination graph once inflated
     * */
    override lateinit var navGraph: NavGraph

    /**
     * navController
     */
    override lateinit var localNavController: NavController

    override val graphName: String
        get() = "nav_fragment2"

    override val packageName: String
        get() = BuildConfig.APPLICATION_ID


}

如上,Fragment1和Fragmet2,处于两个不同的Module,并且没有相互依赖,现在要从Fragment1跳转到Fragment2

Button btnNext = view.findViewById(R.id.btn_next);
        final SecondFragmentRoute route = new SecondFragmentRoute();
        route.addNavGraphDestination(Navigation.findNavController(btnNext),getContext());

        btnNext.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
//                Navigation.findNavController(v).navigate(R.id.action_firstFragment_to_secondFragment);
                route.navigateTo();
            }
        });

这里只是部分核心代码片段,需要注意两点:

1.两个Module的导航文件,命名一定要不同,因为他是在同样的包名下寻找的,一样的话系统会找混,导致跳转失败

2.导航文件的导航界面,id也命名不同,否则,也会无法正常跳转,它会认为自己跳转自己,如果他们命名id一样

 

这是nav_fragment的导航文件

<?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"
    app:startDestination="@id/firstFragment"
    android:id="@+id/nav_fragment">

    <fragment
        android:id="@+id/firstFragment"
        android:name="com.example.navigationtest.FirstFragment"
        android:label="first_layout"
        tools:layout="@layout/first_layout" >
        <action
            android:id="@+id/action_firstFragment_to_secondFragment"
            app:destination="@id/secondFragment" />
    </fragment>

    <fragment
        android:id="@+id/secondFragment"
        android:name="com.example.navigationtest.SecondFragment"
        android:label="second_layout"
        tools:layout="@layout/second_layout" />
</navigation>

然后是nav_fragment2的文件

<?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"
    app:startDestination="@id/secondFragment"
    android:id="@+id/nav_fragment2">

    <fragment
        android:id="@+id/secondFragment"
        android:name="com.example.navigationtest.SecondFragment"
        android:label="second_layout"
        tools:layout="@layout/second_layout" />
</navigation>

可以看到 navigation的命名节点的id是不同的,原来是相同的,无法跳转,改成不同的,就可以正常跳转了

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值