kotlin页面状态管理类

2020-04-27  本文已影响0人  落叶随风花落入泥

引言

在我们移动端开发的过程中,页面状态管理是基本需求之一,以前都是在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<TextView>(R.id.tv_empty_content)
    iv_tips_img = emptyView.findViewById<ImageView>(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<LinearLayout>(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里面

屏幕快照 2020-04-27 上午9.54.35.png
屏幕快照 2020-04-27 上午9.54.53.png

注意点:就是如果要替换局部的view,需要给其外面套一层父布局,要不然会影响和它一个级别的控件。
对这块我知识也比较浅薄,如果有不对的地方,希望大家多多指教,谢谢观看🙏

上一篇下一篇

猜你喜欢

热点阅读