介绍
Conductor是一个基于视图的Android框架..........
GitHub:https://github.com/bluelinelabs/Conductor,
CSDN上仅有的两篇文章:https://blog.csdn.net/qq284565035/article/details/51250046, https://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、Router
是Controller
的集合,通过Backstack
和RouterTransaction
将Controller
放进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生命周期
网友评论