美文网首页android 架构相关知识
android 组件化路由框架

android 组件化路由框架

作者: android源码探索 | 来源:发表于2019-12-27 10:11 被阅读0次

    欢迎大家下载我个人开发的app安琪花园

    gitHub地址

    使用


    在项目的根目录下面的build.gralde添加maven仓库。

     maven { url "https://dl.bintray.com/richzjc/maven" }
    

    其次是在module的build.gradle引用

    如果项目用的kotlin 请将annotationProcessor 改成kapt
    annotationProcessor "com.richzjc:router_compiler:1.0.25"
    implementation "com.richzjc:router_lib:1.0.25"
    

    简介


    该项目是在我同事写的路由库基础之上,做了二次封装。
    同事写的路由地址
    我二次封装后的地址是: 路由库地址

    功能描述


    1. 可以支持给Activity配置路由
    2. 可支持给Fragment配置路由
    3. 可以给实现RouterCallback的类配置路由

    使用步骤


    1. 在对应的gradle文件下面添加如下配置,(注意: 一定是配置在defaultConfig下面)
    android {
        defaultConfig {
            javaCompileOptions {
                annotationProcessorOptions {
                    arguments = [moduleName: project.getName()]
                }
            }
        }
    }
    
    
    1. 在activity的类上面添加注解
    @BindRouter(urls = {"https://wwww.github.com"})
    public class TestActivity extends Activity {
    
    }
    

    注解的上面还可以添加参数 比如:

    @BindRouter(urls = { "https://github.com/leifzhang"}, weight=10)
     public class TestActivity extends Activity {
    
     }
    
    1. 在Callback上面添加注解
    @BindRouter(urls = {"https://wwww.baidu.com"}, isRunnable = true)
    public class SimpleCallBack implements RouterCallback {
        @Override
        public void run(RouterContext context) {
            Toast.makeText(context.getContext(), "testing", Toast.LENGTH_SHORT).show();
        }
    }
    
    1. 最后一步
    Router.sharedRouter().open(路由地址, Context); 
    

    注意: 路由地址最好是以schema://host/path这种结构组成

    Fragment配置路由


    为什么fragment要单独说呢? 因为fragment的路由涉及到运行时注解,而不是编译时注解。
    fragment的路由的用途是:

    比如一个页面用的Viewpager + fragment来实现的, 当给fragment配置路由后, 直接通过fragment的路由会跳转到对应的页面,并定位到对应的fragment
    比如一个页面是用TabHost + fragment来实现,同样的也可以通过fragment的路由定位到对应的tab

    第一步

    给fragment配置路由

    1. 通过注解配置路由
    @FragmentRouter(url = Global.NEWS_MAINFRAGMENT_ROUTER)
    public class NewsMainFragment extends BaseTabFragment{
    }
    
    1. 通过接口配置路由, 实现IFragmentRouter接口
    public class LiveFragment extends BaseRecyclerViewFragment<LiveEntity, LiveRecyclerCallBack, LivePresenter> implements  IFragmentRouter {
    
      @Override
        public String getFragmentRouter() {
            Bundle bundle = getArguments();
            String channel = "";
            if(bundle != null){
                channel = bundle.getString("key", "");
            }
            return Global.LIVE_TAB_LIVE_SUB_FRAGMENT + channel;
        }
    }
    
    

    第二步, 注册路由

            //Vip tab 的 脱水研报
            FragmentRouterModel model18 = new FragmentRouterModel.Builder()
                    .nextFragmentRouter(Global.NEWS_VIP_ROUTER)
                    .nextFragmentRouter(Global.MEMBER_CLUB_DETAIL_ACTION + "dehydration")
                    .build();
    
            //Vip tab 的 Vip 会员
            FragmentRouterModel model19 = new FragmentRouterModel.Builder()
                    .nextFragmentRouter(Global.NEWS_VIP_ROUTER)
                    .nextFragmentRouter(Global.MEMBER_CLUB_DETAIL_ACTION + "gold")
                    .nextFragmentRouter(Global.NEWS_VIP_GOLD_SUB_ROUTER)
                    .build();
    
            Router.map(Global.ALIEN_MAINACTIVITY_ACTION, MainActivity.class,
                    model18,
                    model19);
    

    首先是给Activity设置路由, 如果要跳转到A页面的B Fragment里面的C Fragment,则
    要分别给B Fragment和C Fragment设置路由,并且通过FragmentRouterModel设置进去。

    第三步, 配置SubFragmentRouters注解

    @SubFragmentRouters(fragmentType = SubFragmentType.VIEWPAGER_FRAGMENTS, widgetIdName ="vp_news_main", filedName = "fragments")
    public class NewsMainFragment extends BaseTabFragment<NewsMainCallBack, NewsMainPresenter>{
    }
    

    比方说: 如果要跳转到B Fragment下面的子fragment,则需要在B Fragment上面配置SubFragmentRouters注解。

    subFragmentRouter注解解释:
    fragmentType: 目前只支持像tabHost,和 ViewPager这两种
    widgetIdName: tabHost, ViewPager的xml文件里面的id名字
    fieldName: 是针对ViewPager里面的fragment列表的名字。如(List<Fragment> fragments)

    最后fragment的跳转

    Router.sharedRouter().open(路由地址, Context); 
    

    公众号:

    qrcode_for_gh_c78cd816dc53_344.jpg

    相关文章

      网友评论

        本文标题:android 组件化路由框架

        本文链接:https://www.haomeiwen.com/subject/kgiroctx.html