介紹
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倘屹,
本人依舊沒看明白婿禽,最后還是妥協(xié)掺涛,老老實實看GitHub上的demo工程;
個人理解就是它對view重新做了的封裝匿情,可以做到一個應(yīng)用只需要一個Activity(launcher Activity)兰迫,其他的全部通過control中inflateView()方法注入view;
組件
備注:不能理解得話,可以先看demo實用,回頭再看
組件名 | 介紹 |
---|---|
Controller | 包裝了View 并給出生命周期炬称≈可以看作是有更簡單生命周期的Fragment
|
Router | 為Controller 提供導(dǎo)航,依附于Activity 并持有ViewGroup 玲躯,通過 ControllerChangeHandler 執(zhí)行transaction 去操作ViewGroup
|
ControllerChangeHandler | 負(fù)責(zé)不同Controller 之間的跳轉(zhuǎn)据德,例如動畫和過渡畫面 |
RouterTransaction | 控制Router 傳遞到Controller 的數(shù)據(jù) |
組件之間的關(guān)系
1、Controller
可以理解為view
,用來展示交互界面跷车;
2棘利、Router
是Controller
的集合,通過Backstack
和RouterTransaction
將Controller
放進(jìn)Router
中朽缴;
3善玫、Controller
可以獲得Router
的實例,再通過Router
繼續(xù)添加下一個交互界面(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有點設(shè)置棧頂?shù)囊馑迹? }
}
@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://跳轉(zhuǎn)到下一個交互界面距芬,通過 getRouter()獲取Router的實例涝开,再通過pushController將新的Controller(交互界面)注入;
getRouter().pushController(RouterTransaction.with(new NavigationDemoController(0, DisplayUpMode.SHOW_FOR_CHILDREN_ONLY))
.pushChangeHandler(new FadeChangeHandler())//通過FadeChangeHandler(繼承ControllerChangeHandler)設(shè)置界面切換方式框仔,設(shè)置動畫和過渡畫面等
.popChangeHandler(new FadeChangeHandler())//通過FadeChangeHandler(繼承ControllerChangeHandler)設(shè)置界面切換方式舀武,設(shè)置動畫和過渡畫面等
.tag(NavigationDemoController.TAG_UP_TRANSACTION)
);
break;
case TRANSITIONS:
getRouter().pushController(TransitionDemoController.getRouterTransaction(0, this));//也可通過getRouterTransaction方式獲得RouterTransaction對象,并將TransitionDemoController(繼承Controller)放進(jìn)Router离斩;
break;
..........
..........
}
}
生命周期
image.png