BaseFragment.kt 4.08 KB
Newer Older
1
package com.ydl.ydlcommon.base
konghaorui committed
2 3

import android.os.Bundle
YKai committed
4 5
import androidx.annotation.LayoutRes
import androidx.fragment.app.Fragment
konghaorui committed
6 7 8 9
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.trello.rxlifecycle2.android.FragmentEvent
10 11 12
import com.ydl.ydlcommon.base.lifecycle.IFragmentLifecycleable
import com.ydl.ydlcommon.bean.StatusBarOptions
import com.ydl.ydlcommon.utils.StatusBarUtils
konghaorui committed
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
import io.reactivex.subjects.BehaviorSubject
import io.reactivex.subjects.Subject

/**
 * author : Zhangwenchao
 * e-mail : zhangwch@yidianling.com
 * time   : 2018/01/27
 *
 * 若需要采用Lazy方式加载的Fragment,初始化内容放到 initDataAndEventLazy 实现
 * 若不需要Lazy加载则初始化内容放到 initDataAndEvent 即可
 *
 * 注意事项 1:
 * 如果是与ViewPager一起使用,调用的是setUserVisibleHint。
 *
 * 注意事项 2:
 * 如果是通过FragmentTransaction的show和hide的方法来控制显示,调用的是onHiddenChanged.
 * 针对初始就show的Fragment 为了触发onHiddenChanged事件 达到lazy效果 需要先hide再show
 */
abstract class BaseFragment : Fragment() ,IFragmentLifecycleable{
    private val mLifecycleSubject = BehaviorSubject.create<FragmentEvent>()

    //Fragment的View加载完毕的标记
    private var isViewCreated: Boolean = false
    //Fragment对用户可见的标记
    private var isUIVisible: Boolean = false
    //Fragment 第一次加载的标记
    private var isFirstLoad: Boolean = false
    //是否有setUserVisibleHint方法
    private var isSetUserVisibleHint = false

    override fun provideLifecycleSubject(): Subject<FragmentEvent> {
        return mLifecycleSubject;
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        isFirstLoad = true
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val layoutResId = layoutResId()
        return when {
            layoutResId != 0 -> {
                val childView =   inflater.inflate(layoutResId, container, false)
konghaorui committed
57
                if (getStatusViewOptions().isAddStatusView){
58
                    val returnViews = StatusBarUtils.initStatusBarView(activity!!, childView, getStatusViewOptions(), true)
59 60

                    return returnViews[0]
konghaorui committed
61 62 63 64 65 66 67 68 69 70
                }else{
                    return childView;
                }
            }
            else -> super.onCreateView(inflater, container, savedInstanceState)
        }
    }

    protected lateinit var rootView: View

konghaorui committed
71 72
    fun getIsViewCreated() = isViewCreated

konghaorui committed
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        isViewCreated = true
        rootView = view
        initDataAndEvent()
        lazyLoad()
    }

    override fun setUserVisibleHint(isVisibleToUser: Boolean) {
        super.setUserVisibleHint(isVisibleToUser)
        isUIVisible = isVisibleToUser
        isSetUserVisibleHint = true
        lazyLoad()
    }

    override fun onHiddenChanged(hidden: Boolean) {
        super.onHiddenChanged(hidden)
        isUIVisible = !hidden
        lazyLoad()

    }


    private fun lazyLoad() {
        if (isViewCreated && isUIVisible && isFirstLoad) {
            initDataAndEventLazy()
            //数据加载完毕,恢复标记,防止重复加载
            isFirstLoad = false
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        isSetUserVisibleHint = false
    }


    @LayoutRes
    abstract fun layoutResId(): Int

    abstract fun initDataAndEvent()

    abstract fun initDataAndEventLazy()

    protected var callback: Callback? = null

    fun setCallback(callback: Callback): Fragment {
        this.callback = callback
        return this
    }

    // 用于单 fragment 的 activity 中用于替换 fragment 的接口
    interface Callback {
        fun replace(fragment: Fragment)
    }


konghaorui committed
130 131 132 133 134
    open fun getStatusViewOptions():StatusBarOptions{
        return StatusBarOptions()
    }


konghaorui committed
135 136 137 138
    override fun onDestroyView() {
        super.onDestroyView()
    }
}