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是不同的,原来是相同的,无法跳转,改成不同的,就可以正常跳转了