谷歌jetpack开源库更新了很多内容,最近比较感兴趣的时候其中新增的Navigation,专门用来实现单Activity多Fragment的方案,以前项目中要自己实现栈来维护,开源的可能就是鼎鼎大名的Fragmentation,可能感觉坑有点多,所以这次想用Navigation来实现练练手,万一以后自己有了这样的需求也不好说!网上搜索了一大堆,但是自己感觉没有哪一个教程很详细,最后很无奈,废话就扯这么多吧!!!!!!
好吧,先上一个效果图吧,看下简单的Navigation实现的具体的效果
如果你想在你的项目里面引用Navigation的话,那么你的Studio必须是3.2以上的版本,在setting里面开启支持Navigation的功能才能使用,如下图
然后在你的项目里面引用Navigation的依赖,这样才能正常使用navigation
def nav_version = "1.0.0-alpha06"
implementation "android.arch.navigation:navigation-fragment:$nav_version"
implementation "android.arch.navigation:navigation-ui:$nav_version"
然后在res里面创建navigation路由的xml文件
创建好了以后,咱们可以创建我的Fragment界面,然后在xml里面来编辑我的路由文件
如上图所示,在创建的Navigation的xml文件里面选中Design模式,点击左上角的+号可以导入我们创建好的fragment文件,选中我们导入的fragment文件以后会有小圆点,直接用鼠标拖拽我们想要路由到的界面,这个功能有点像IOS的storyBorad,在xml里面你会看到如果拖拽了线条的话会自动生成一个action的选项,这个里面带一个id,这个id就是我们待会要用来实现fragment路由跳转的id值,好了,回到fragment里面我们看看怎么才能实现路由跳转呢?
穿件homeFragment的时候,需要创建一个fragment来让我导入创建的naviGrap,具体布局的界面的实现实在firstFragment如下图
两个属性要注意,
app:defaultNavHost="true"
app:navGraph="@navigation/navi"
一个是开启默认的navHost效果,navGraph是我们创建的navigation的路由,这样才能导入
我由于自己测试,将fragment放在了fragment里面,所以导航的时候可能api用的有点差异
Bundle bundle = new Bundle();
bundle.putInt("id",15);
NavOptions navOptions = new NavOptions.Builder().build();
navOptions.shouldLaunchSingleTop();
Navigation.findNavController(view).navigate(R.id.action_firstFragment_to_secondFragment,bundle);
上面由于实在fragment里面使用,所用用了findnavController(view),这里的view是fragment填充的view,bundle是为了实现fragment之间跳转的时候像intent一样传值,非常的方便,如果实在Activity·里面使用的话,我们可以使用另外的一种形式,如下所示
Navigation.findNavController(this, R.id.fragment);
这大概就是Navigaton的使用的大体流程,如果不会的同学,我demo会放上地址,可以看看demo的具体
使用,写的可能有点凌乱,但是看了基本上都会写
demo地址:https://github.com/WinWang/navigation