Arouter分模块下进行fragment切换

  • 前言
    • 最近在项目开发时,自己想使用一下分模块,但是这期间遇到很多问题,这里记录一下在项目快结束时遇到的一个问题,先上图


      Arouter分模块下进行fragment切换_第1张图片
      E909A77F-11C3-4FAD-80FA-9C3203BC0998.png
  • 情况
    • 先介绍一下情况,整个是一个主界面,使用FrameLayout和底部tab+fragment
    • A页面,也就是A fragment,内部三个按钮b1,b2,b3
    • B页面,也就是B fragment,内部上面是TabLayout中间是ViewPager,两者结合进行内部fragment切换
  • 需求
    • 点击A页面中的对应按钮,跳转到B页面中的对应TabLayout中的对应tab
  • 难点
    -如果没有使用分模块的话相信这个实现起来很简单的,也就是点击相应按钮,然后切换到Bfragment 然后传入一个相应的值
    • 但是目前是使用分模块,模块A与B之间没有互相引用,所以只能通过Arouter来进行模块间的操作。
  • 解决方法
    • 首先这里用到的两个库就是Arouter,另一个就是start很高的AndroidUtilCode
      我们用到的就是其中的Activity管理工具
    • 1.先设置整个主界面开启时传入一个值,代表开启主界面的那个fragment,就拿这里来讲,如果我们接受到的是0就开启A fragment,相应1开启B fragment,2开启Cfragment
    • 2.设置B fragment显示时传入一个值,代表B页面内,显示b1,b2还是b3中的哪个tab,这里也对应0,1,2吧
    • 3.假设点击A页面的b3按钮,意思是我们现在想跳转到B fragment,并且显示b3这个tab下的内容,此时我们就应该设置b3的点击事件为
b3.setOnClickListener(v -> {
            MyApplication.nowTab = 2;
            ARouter.getInstance().build("/app/main")
                    .withInt("type",1)
                    .navigation();
        });
  • 解释:
    • MyApplication.nowTab = 2;是在你的application里面放一个标识,就是开启BFragment的哪个tab 这里要开启b3所以我们存2,在B fragment需要显示的时候就会读取这个值
    • 这里的 /app/main是你要跳转的Activity的路由地址,这是Arouter基础,麻烦自己去看一下 ,withInt就是说我开启页面并且传一个int值到开启的页面,然后type=1 就是说我要新建一个整个主页面,并且我要开开启B fragment 上面说了的1 对应B,然后我们在主页面接受这个type然后判断具体开启哪个Fragment
    • 其实整个思路就是再新开一个这个页面,只是新开的页面首先展示哪个fragment使我们指定的,但是这样有一个问题,就是会存在两个主页面,然后我们就在这个主页面创建的时候使用activity管理工具
ActivityUtils.finishAllActivitiesExceptNewest();
  • 这就是AndroidUtilCode中的一个工具方法类。上面这句话是结束除了当前activity以外的所有activity,这样就解决有两个主页面的问题

这里更新一下另一种方法!!!

  • 就在昨天刚写完文章之后,想到另一种方法
  • 先说说上面的方法有哪些缺点
    • 1.新开页面,会有一个切换页面的动画,跟点击下面tab切换的时候的视觉效果有差别。
    • 2.在开启主页面时需要判断是第一次打开还是我点击中间按钮再打开的,多一步判断
  • 新的解决思路
    • 将主页面Activity设置为singleTask,也就是说当前任务栈里面我们只能启动一个当前Activity实例,那么问题来了,上面是新开,现在已经存在一个实例了,我们不能新开了,这里就涉及到onNewIntent的调用时机,我们再次点击b3时会请求新开一个主页面,但是任务栈已经存在主页面,就会回调主页面的onNewIntent方法,所以我们就可以直接在onNewIntent方法中切换到B fragment,而且切换的视觉效果也和直接点底部的tab切换效果一样。

你可能感兴趣的:(Arouter分模块下进行fragment切换)