bluelinelabs/Conductor开发框架实用

2019-04-25  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读