美文网首页
bluelinelabs/Conductor开发框架实用

bluelinelabs/Conductor开发框架实用

作者: 偷的浮生整日闲 | 来源:发表于2019-04-25 17:32 被阅读0次

    介绍

    Conductor是一个基于视图的Android框架..........
    GitHub:https://github.com/bluelinelabs/Conductor
    CSDN上仅有的两篇文章:https://blog.csdn.net/qq284565035/article/details/51250046https://blog.csdn.net/qq284565035/article/details/51251553
    本人依旧没看明白,最后还是妥协,老老实实看GitHub上的demo工程;
    个人理解就是它对view重新做了的封装,可以做到一个应用只需要一个Activity(launcher Activity),其他的全部通过control中inflateView()方法注入view;

    组件

    备注:不能理解得话,可以先看demo实用,回头再看
    组件名 介绍
    Controller 包装了View并给出生命周期。可以看作是有更简单生命周期的Fragment
    Router Controller提供导航,依附于Activity并持有ViewGroup,通过 ControllerChangeHandler执行transaction去操作ViewGroup
    ControllerChangeHandler 负责不同Controller之间的跳转,例如动画和过渡画面
    RouterTransaction 控制Router传递到Controller的数据

    组件之间的关系

    1、Controller可以理解为view,用来展示交互界面;
    2、RouterController的集合,通过BackstackRouterTransactionController放进Router中;
    3、Controller可以获得Router的实例,再通过Router继续添加下一个交互界面(Controller)。
    image.png

    demo实用

    下面用demo解释(看demo注释):
    MainActivity:
    public final class MainActivity extends AppCompatActivity implements ActionBarProvider {
    
        @BindView(R.id.toolbar) Toolbar toolbar;
        @BindView(R.id.controller_container) ViewGroup container;
    
        private Router router;//用来管理界面的生命周期,类似于List<Activity>
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_main);//layout中需要一个com.bluelinelabs.conductor.ChangeHandlerFrameLayout继承于ViewGroup,通常用contianer来命名
            ButterKnife.bind(this);
    
            setSupportActionBar(toolbar);
    
            router = Conductor.attachRouter(this, container, savedInstanceState);//Conductor.attachRouter用一次实例化Router,可以理解为一个栈,可以往里面放Controller(Controller里面注入真实的view)
            if (!router.hasRootController()) {
                router.setRoot(RouterTransaction.with(new HomeController()));//实际上Router,里面放的是RouterTransaction,RouterTransaction里面包含了自定义的Controller;setRoot有点设置栈顶的意思;
            }
        }
    
        @Override
        public void onBackPressed() {
            if (!router.handleBack()) {
                super.onBackPressed();
            }
        }
    
    }
    
    HomeController核心代码:
    public class HomeController extends BaseController {
          ..........
          ..........
     
       @NonNull
        @Override
        protected View inflateView(@NonNull LayoutInflater inflater, @NonNull ViewGroup container) {
            return inflater.inflate(R.layout.controller_home, container, false);//注入交互界面,其实就是MainActivity的界面
        }
     void onModelRowClick(DemoModel model, int position) {
            switch (model) {
                case NAVIGATION://跳转到下一个交互界面,通过 getRouter()获取Router的实例,再通过pushController将新的Controller(交互界面)注入;
                    getRouter().pushController(RouterTransaction.with(new NavigationDemoController(0, DisplayUpMode.SHOW_FOR_CHILDREN_ONLY))
                            .pushChangeHandler(new FadeChangeHandler())//通过FadeChangeHandler(继承ControllerChangeHandler)设置界面切换方式,设置动画和过渡画面等
                            .popChangeHandler(new FadeChangeHandler())//通过FadeChangeHandler(继承ControllerChangeHandler)设置界面切换方式,设置动画和过渡画面等
                            .tag(NavigationDemoController.TAG_UP_TRANSACTION)
                    );
                    break;
                case TRANSITIONS:
                    getRouter().pushController(TransitionDemoController.getRouterTransaction(0, this));//也可通过getRouterTransaction方式获得RouterTransaction对象,并将TransitionDemoController(继承Controller)放进Router;
                    break;
          ..........
          ..........
     
        }
    }
    

    生命周期

    image.png

    相关文章

      网友评论

          本文标题:bluelinelabs/Conductor开发框架实用

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