引言
在我们移动端开发的过程中,页面状态管理是基本需求之一,以前都是在github上直接找一个工具类,直接在项目中使用,现在项目用kotlin 语言进行开发,就想自己写一个简单实用的,发现对这快封装的思想一知半解都谈不上,这就是用多了框架没有熟悉其原理的结果,如果有和我类似的同学,引以为戒,在使用一个东西中,把它变成自己的一部分,这个思想要根深蒂固在我们的头脑中。
封装思路总结:
一、编写我们自己项目的状态布局页面
二、根据我们要替换的target 布局,通过target找到其父布局
三、把我们的状态布局添加到父布局中,根据状态码,让相应的布局展示和隐藏就达到了我们的效果。
四、把target外面嵌套一层父布局,目的是防止影响和其平级的控件,可以试一下,效果能更直观。
下面是我简单封装的一个管理空数据的管理类,能体现封装思路,如果有多个可以自己根据需求自己添加。代码如下:
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import com.standard.base.R
import com.standard.base.constant.Constants
/**
* Create by zsy on 2020/4/26
*
* 页面状态管理类,只满足无数据的时候,使用的时候需要判断一下数据是否. 为空
*/
class PageStateManager {
private lateinit var context: Context
private lateinit var mInflater: LayoutInflater
//一般都是主视图
private lateinit var mTargetView: View
//空视图
private lateinit var emptyView: View
//错误视图
private lateinit var errorView: View
//展示文字
private lateinit var tv_empty_contents: TextView
//展示图片
private lateinit var iv_tips_img: ImageView
private lateinit var tagetView: View
constructor(context: Context, resLayoutId: Int) {
initView(context, resLayoutId, null)
}
constructor(context: Context, view: View) {
initView(context, 0, view)
}
/**
* 初始化 所有视图及相关控件
*/
private fun initView(context: Context, resLayoutId: Int, view: Any?) {
this.context = context
val layoutParams = FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
)
if (resLayoutId == 0) {
this.mTargetView = view as View
} else {
mInflater = LayoutInflater.from(context)
mTargetView = mInflater.inflate(resLayoutId, null)
}
//空数据视图异常
emptyView = mInflater.inflate(R.layout.comment_empty_layout, null)
emptyView.layoutParams = layoutParams
emptyView.id = R.id.ll_empty
//错误异常视图
errorView = mInflater.inflate(R.layout.commnent_error_layout, null)
tv_empty_contents = emptyView.findViewById(R.id.tv_empty_content)
iv_tips_img = emptyView.findViewById(R.id.iv_empty_img)
}
/**
* 展示空数据,把taget 视图隐藏
* taget :目标视图
* status:状态码,可以是后台也可以是自定义的状态码,这里是自定义的0 为空数据状态码
*/
fun showResult(taget: View, status: Int) {
//找到taget的父视图
val parent = taget.parent as ViewGroup
val tempTis = parent.findViewById(R.id.ll_empty)
if (tempTis == null) {
parent.addView(emptyView)
} else {
emptyView.visibility = View.VISIBLE
}
//根据状态码,给icon 和text 设置图片和文本
if (status == Constants.noData) {
//隐藏目标是图,展示空视图
taget.visibility = View.GONE
//设置空图片
iv_tips_img.setBackgroundResource(R.mipmap.ic_launcher)
tv_empty_contents.setText("没有数据")
} else {
//如果有数据,就隐藏空视图
emptyView.visibility = View.GONE
taget.visibility = View.VISIBLE
}
}
}
项目使用如下,我是放在了base里面
注意点:就是如果要替换局部的view,需要给其外面套一层父布局,要不然会影响和它一个级别的控件。
对这块我知识也比较浅薄,如果有不对的地方,希望大家多多指教,谢谢观看