美文网首页
kotlin页面状态管理类

kotlin页面状态管理类

作者: 落叶随风花落入泥 | 来源:发表于2020-04-27 09:44 被阅读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,需要给其外面套一层父布局,要不然会影响和它一个级别的控件。
    对这块我知识也比较浅薄,如果有不对的地方,希望大家多多指教,谢谢观看🙏

    相关文章

      网友评论

          本文标题:kotlin页面状态管理类

          本文链接:https://www.haomeiwen.com/subject/lgiewhtx.html