All Projects → KaiXuan666 → Windowtree

KaiXuan666 / Windowtree

一个帮你维护界面父子层级关系的框架,轻松达成全局小红点提示,界面权限管理,界面通讯,界面自动化构建等强大功能

Programming Languages

kotlin
9241 projects

WindowTree

只需使用注解,帮助你轻松维护树形界面的层级关系,管理你的界面结构,当你处于界面的任何位置时,都可以知道,我在哪里,我的父界面是谁,我的子界面是谁。甚至能够自动构建你的界面结构。

WindowTree结构

avatar

windowTree将应用内的所有界面都视为一个Window,每个window都拥有与之关联的WindowInfo,借助WindowInfo,你可以完成灵活、强大的工作。

目前支持的功能:

  1. 维护了父子界面的层级关系,你在应用的任意位置,都可以知道我的父界面是谁,我的子界面有几个等
  2. 灵活的消息通讯,你可以在任意位置发送消息给任意界面,支持双向通讯,你可以知道接收者处理该消息的结果
  3. 支持贯穿全局的未读消息小红点,一个父节点能够智能计算出他所拥有的所有子节点的未读消息之和,借助Kotlin的委托属性实现了数量变化实时通知更新!
  4. 智能的权限管理,当用户未拥有a的子界面a1,a2的权限时,也将失去a的界面权限
  5. 界面自动化搭建,你只需要使用注解定义好界面的层级关系,便可以调用api获取所有子界面,一个循环全部建立
  6. 统一管理界面跳转,便于管理界面和埋点统计,减少重复代码
  7. 支持Activity、Fragment、View、Dialog、PopupWindow...

WindowTree使用

添加依赖项:

apply plugin: 'kotlin-kapt'

...
dependencies {
    kapt 'com.kaixuan:windowtree-compiler:1.0.0'
    implementation 'com.kaixuan:windowtree-library:1.0.0'
    ...
}
  1. 在你应用的所有界面添加注解@Window,参数parentClass指定该界面的父节点(如当前是顶级节点,则不需要设置该属性),可选添加其他属性,index表示当前界面是父界面的第几个同类界面,name表示当前节点名字
@Window(parentClass = MainActivity::class,index = 2,name = "联系人") 
class ContactsFragment : Fragment() 

2. 在应用启动时,初始化WindowTree
WindowTree.init(MyApp.instance)

    • 使用kotlin时,可直接在界面类(Activity、Fragment等)中使用扩展属性mWindowInfo拿到当前界面对应的WindowInfo
    • 使用java时,使用WindowTree.with(this)获取当前界面对应的WindowInfo

  1. 如需接收消息,需要给当前节点设置setEventListener
mWindowInfo.setEventListener { sender, sendData ->
    if (sendData is UnReadCountEvent){
        tv_log.append("未读消息:${sender.name}的未读消息发生变化,数量变化=${sendData.change}\n")
        updateUnReadCount()
        [email protected] "ok 我已收到并处理完毕"  // 支持返回给消息发送者一个回信
    }
    [email protected] null 
}

windowTree支持消息接收者返回一个结果的应答,告知事件处理结果


  1. 拿到我的父节点或子节点对象,使用当前的WindowInfo对象可以轻松找到父节点和子节点,如:
mWindowInfo.parent
mWindowInfo.child

6. 界面自动构建,如果你使用TabLayout管理你的界面,只需要以下代码即可将当前界面的所有子界面加入到Tab
tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener{
    override fun onTabReselected(tab: TabLayout.Tab?) {
    }

    override fun onTabUnselected(tab: TabLayout.Tab?) {
    }

    override fun onTabSelected(tab: TabLayout.Tab?) {
        mWindowInfo.jump(tab!!.position,WindowType.FRAGMENTV4)
    }
})
mWindowInfo.filterChildByWindowType(WindowType.FRAGMENTV4).forEach { window ->
    tabLayout.addTab(tabLayout.newTab().setText(window.name).setTag(window))
}

7. 界面跳转控制
mWindowInfo.jump(0,WindowType.FRAGMENTV4)

这段代码表示,跳转到我的第1个Fragment类型的子界面

DefaultJumpAdapter中默认实现了一些跳转逻辑,你可以继承它实现自己的特殊逻辑



如果你有更好的建议欢迎与我联系!thank you![email protected]

github:https://github.com/KaiXuan666/WindowTree csdn:https://blog.csdn.net/kaixuan_dashen

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].