按照分层架构与数据驱动为架构核心封装的脚手架,可快速搭建出基于Google最新架构建议的项目框架。
从View的角色去看待Activity与Fragment,在使用场景上它们承担的职责基本一致即:接收数据>展示数据 所以为这两者提供高度一致性的API,统一抽象为 init,与 bindData 两个方法。并提供对VB 与 VM的自动初始化
核心功能:
- 1.明确View层在架构中的职责边界,规范初始化方法与简化生命周期
- 2.支持参数注解,自动初始化
- 3.ViewBinding 一行代码快速初始化(fragment 中自动跟随声命周期)
- 4.ViewModel 作用域管理、一行代码快速初始化
- 5.Fragment 可见状态简化管理
- 6.LiveData 支持无粘性消息
- 7.Fragment 快速切换(防重叠)
implementation("com.foundation.app:activity-fragment:1.1.1")
- Base层对初始化方法的编排顺序
override fun onCreate(savedInstanceState: Bundle?) {
val support = supportRebuildData()//1
val state = if (support) savedInstanceState else null
beforeSuperOnCreate(state)//2
super.onCreate(state)//3
afterSuperOnCreate(state)//4
getContentVB()?.let { setContentView(it.root) }//5
initViewModel()//6
init(state)//7
bindData()//8
}
- Fragment 初始化方法顺序
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
initViewModel()//1
}
@CallSuper
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
init(savedInstanceState)//2
bindData()//3
}
是否兼容JAVA:是
@BundleParams("userName")
private String userName = "没自动赋值";
@BundleParams("userDesc")
private val userDesc: UserDesc = UserDesc()
@BundleParamsUseSerializable
@BundleParams("userDesc")
private val userDesc: UserDescSerializable = UserDescSerializable()
ParamsUtils.initWithActivity()
ParamsUtils.initWithFragment()
openAutoBindParams(): Boolean = false
Tips:onNewIntent
中不会进行重新绑定
是否兼容JAVA:否
参考了默认fragment支持的自动根据布局id创建出根View,耦合性更低。 语意也更清晰,满足所见即所得。
class UserInfoActivity : BaseActivity() {
private val vbBinding by lazyAndSetRoot<ActUserInfoBinding>()
}
class SkillListFragment : BaseViewBindingFragment(R.layout.act_vb) {
val actVbBinding by lazyVB<ActVbBinding>()
fun bindData() {
actVbBinding.yourView
}
}
是否兼容JAVA:是
完全使用反射初始化,耦合性较高,且无法脱离范型限制。
class UserInfoFragment : BaseFragment<ActVbBinding>() {
fun bindData() {
viewBinding.yourView
//在java中使用
jViewBinding.yourView
}
}
fun onViewBindingDestroy()
此函数用于做一些跟view相关的释放工作。
Tips:如果在onDestoryView
中访问 XXbinding
将得到NPE,因为这是完全不被允许的,详情可参考google 文档建议
是否支持JAVA: 否
private val homeVM by lazyActivityVM<HomeVM>()
是否支持JAVA: 是
private lateinit var homeVM:HomeVM
override fun initViewModel() {
super.initViewModel()
homeVM = getActivityVM(HomeVM::class.java)
}
- Activity 两个
getActivityVM(clz: Class<VM>): VM
lazyActivityVM(): Lazy<VM>
getGlobalVM(clz: Class<VM>): VM
lazyGlobalVM(): Lazy<VM>
- Fragment
getFragmentVM(clz: Class<VM>): VM
lazyFragmentVM(): Lazy<VM>
getActivityVM(clz: Class<VM>): VM
lazyActivityVM(): Lazy<VM>
getGlobalVM(clz: Class<VM>): VM
lazyGlobalVM(): Lazy<VM>
Tips:使用时对于可见状态完全依赖于底层框架的API,避免使用onResume
,onPause
这两个生命周期,否则将得到不可预期的状态
可见时回调
abstract fun onVisible(isFirst: Boolean)
不可见时回调
abstract fun onHidden()
kotlin 中使用
yourLiveData.observerStickyLess(this) {}
java 中使用
LiveDataExt.observerStickyLess(yourLiveData,this,it->{});
Activity 与 fragment中的API 相同
fun switchFragment(
@NonNull currentFragment: Fragment,
@IdRes frameLayoutId: Int = 0,
tag: String? = null
)
fun switchFragment(tag: String, @IdRes frameLayoutId: Int = 0): Fragment?
Tips:默认关闭了Activity重建
/**
* 是否支持activity被杀死后重建(是否使用 savedInstanceState中相关数据,
* 系统默认在其中保存了Fragment的状态,重建会导致fragment异常展示)
*
* @return 默认不支持。如果返回true,则必须测试杀死后重建的流程
*/
protected open fun supportRebuildData() = false