-
Notifications
You must be signed in to change notification settings - Fork 1
view router & holder
muune edited this page Feb 27, 2019
·
3 revisions
- ChHolderBase(abstract class)
- ChGroupBase(class)
- ChFragmentBase(class)
- restore()
- push()
- pop()
- pause()
- resume()
Ch.router(private val base: ChHolderBase<T>
- Hoder들의 router처리기
- [생성자]
val framentBase = Ch.fragmentBase()
val routerf = Ch.router(framentBase)
var groupBase = Ch.groupBase()
val router = Ch.router(groupBase)
restore()
- Holder 복원
router.restore()
unlockPush()
- pushLock을 false로
- push 메소드를 사용할 때 isAutoUnlock를 false로 한 경우 unlockPush를 하지 않는 이상 push가 실행되지 않는다.
App.router.unlockPush()
unlockPop()
- popLock을 false로
- pop 메소드를 사용할 때 isAutoUnlock를 false로 한 경우 unlockPop를 하지 않는 이상 pop가 실행되지 않는다.
App.router.unlockPop()
push(holder: ChHolder<T>, isAutoUnlock:Boolean = true)
- router에 타겟 holder를 push한다(보이게 한다)
- 타겟 holder를 Resume 시키고, 원래 있던 holder는 pause시킴
- isAutoUnlock이 false이면 unlockPush를 하지 않는 이상 push가 실행되지 않는다.
object Main : ChHolder<View>(){
private val main = MainVM
override fun create(base: ChHolderBase<View>): View{
if(base !is ChGroupBase) throw Exception("invalid base:$base")
return Ch.scanner.scan(this, base.inflate(R.layout.main)).render()
}
}
App.router.push(Main, false)
pop(isAutoUnlock:Boolean = true):Int
- router에 holder를 pop함(맨 위에 있는 holder를 사라지게 함)
- 보여질 holder는 Resume 시킴
- isAutoUnlock이 false이면 unlockPop를 하지 않는 이상 pop이 실행되지 않는다.
router.pop()
jump(holder: ChHolder<T>)
- router에 holder를 jump함(타겟 holder이 보일 때까지 나머지 holder를 사라지게 함(pop함))
router.jump(holder)
- 뷰를 물고 있는 대상
- 추상 클래스 : ChHolder<ViewType>을 상속해서 구현한다.
- 참고 코드 MainHD
object MainHD: ChHolder<View>(){
private val main = MainVM
override fun create(base: ChHolderBase<View>): View{
if(base !is ChGroupBase) throw Exception("invalid base:$base")
return Ch.scanner.scan(this, base.inflate(R.layout.main)).render()
}
}
abstract class Scene: ChHolder<View>(){
private var inflater: LayoutInflater? = null
private var scan:ChScanned? = null
override fun create(base: ChHolderBase<View>):View{
if(base !is ChGroupBase) throw Exception("")
vmInit()
if(base.inflater != inflater) {
inflater = base.inflater
val view = base.inflate(layout())
scan?.let{it.view = view} ?: run{scan = Ch.scanner.scan(this, view)}
}
return scan!!.render()
}
fun render() = scan?.render()
fun renderSync() = scan?.renderSync()
fun alert(msg:String) = AppVM.alert(msg, scan!!)
abstract fun layout():Int
abstract fun vmInit()
}
abstract fun create(base: ChHolderBase<T>):T
- ChHolder가 생성될 때 홀더가 해야 할 일을 오버라이드해서 구현[필수]
//MainHD
override fun create(base: ChHolderBase<View>): View{
if(base !is ChGroupBase) throw Exception("invalid base:$base")
return Ch.scanner.scan(this, base.inflate(R.layout.main)).render()
}
push(base: ChHolderBase<T>, isRestore:Boolean)
- 라우터가 push될때 호출된다.
- push될때 Holder 해야 할 일이 있을 때 함수를 오버라이드해서 내부를 구현한다.
override fun push(base: ChHolderBase<View>, isRestore:Boolean){
...
}
resume(base: ChHolderBase<T>, isRestore:Boolean)
- 라우터가 resume될때 호출된다.
- resume될때 Holder 해야 할 일이 있을 때 함수를 오버라이드해서 내부를 구현한다.
override fun resume(base: ChHolderBase<View>, isRestore:Boolean){
...
}
pause(base: ChHolderBase<T>, isJump:Boolean)
- 라우터가 pause될때 호출된다.
- pause될때 Holder 해야 할 일이 있을 때 함수를 오버라이드해서 내부를 구현한다.
override fun pause(base: ChHolderBase<View>, isJump: Boolean) {
...
}
pop(base: ChHolderBase<T>, isJump:Boolean):Boolean = true
- 라우터가 pop될때 호출된다.
- pop될때 Holder 해야 할 일이 있을 때 함수를 오버라이드해서 내부를 구현한다.
//Step1HD
override fun pop(base: ChHolderBase<View>, isJump: Boolean):Boolean {
val w = -groupBase.group.width.toDouble()
looper{
time = 350
ended = {base.pop(this@Step1HD)}
block = {Ch.prop.view.x(view, it.backIn(0.0, w))}
}
return false
}
- ViewType에 따라 push와 pop에서 해야 할 일이 다르므로 그 부분을 ChHolderBase를 상속받은 각자의 HolderBase를 만든다.
- 추상 클래스 : ChHolderBase<ViewType>을 상속해서 구현한다.
- class ChGroupBase: ChHolderBase<View> : View 타입 HolderBase
- class ChFragmentBase: ChHolderBase<ChFragmentInfo> : Fragment 타입 HolderBase
class ChGroupBase: ChHolderBase<View>(){
lateinit var inflater:LayoutInflater
lateinit var group:ViewGroup
fun group(it:ViewGroup){
group = it
inflater = (group.context as AppCompatActivity).layoutInflater
group.removeAllViews()
restore()
}
fun inflate(id:Int, isMerge:Boolean = false):View = inflater.inflate(id, group, isMerge)
override fun push(holder: ChHolder<View>){
group.addView(holder.create(this))
group.visibility = View.VISIBLE
}
override fun pop(holder: ChHolder<View>){
group.removeViewAt(group.childCount - 1)
if(group.childCount == 0) group.visibility = View.GONE
}
}
class ChFragmentBase: ChHolderBase<ChFragmentInfo>(){
lateinit var manager:FragmentManager
var container:Int = 0
override fun push(holder: ChHolder<ChFragmentInfo>) = with(holder.create(this)) {
val ft = manager.beginTransaction()
if(transition != 0) ft.setTransition(transition)
if(style != 0) ft.setTransitionStyle(style)
when(animation.size){
2->ft.setCustomAnimations(animation[0], animation[1])
4->ft.setCustomAnimations(animation[0], animation[1], animation[2], animation[3])
}
ft.add(container, fragment, tag)
ft.addToBackStack(backStack)
ft.commitAllowingStateLoss()
manager.executePendingTransactions()
Unit
}
override fun pop(holder: ChHolder<ChFragmentInfo>){
manager.popBackStackImmediate()
}
}
restore()
- 라우터의 restore(복원)함수를 호출한다.
//ChGroupBase
fun group(it:ViewGroup){
group = it
inflater = (group.context as AppCompatActivity).layoutInflater
group.removeAllViews()
restore()
}
push(holder: ChHolder<T>)
- 라우터가 push될때 호출된다.
- push될때 HolderBase가 해야 할 일이 있을 때 함수를 오버라이드해서 내부를 구현한다.
//ChGroupBase
override fun push(holder: ChHolder<View>){
group.addView(holder.create(this))
group.visibility = View.VISIBLE
}
pop(holder: ChHolder<T>)
- 라우터가 pop될때 호출된다.
- pop될 때 HolderBase가 해야 할 일이 있을 때 함수를 오버라이드해서 내부를 구현한다.
//ChGroupBase
override fun pop(holder: ChHolder<View>){
group.removeViewAt(group.childCount - 1)
if(group.childCount == 0) group.visibility = View.GONE
}
//ChFragmentBase
override fun pop(holder: ChHolder<ChFragmentInfo>){
manager.popBackStackImmediate()
}
pause(holder: ChHolder<T>)
- 라우터가 pause될때 호출된다.
- pause될때 HolderBase가 해야 할 일이 있을 때 함수를 오버라이드해서 내부를 구현한다.
resume(holder: ChHolder<T>)
- 라우터가 resume될때 호출된다.
- resume될때 HolderBase가 해야 할 일이 있을 때 함수를 오버라이드해서 내부를 구현한다.