package com.fly.tour.common.base
import android.os.Bundle
import androidx.fragment.app.Fragment
import androidx.appcompat.widget.Toolbar
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.ViewStub
import android.widget.TextView
import com.alibaba.android.arouter.launcher.ARouter
import com.fly.tour.common.R
import com.fly.tour.common.event.common.BaseFragmentEvent
import com.fly.tour.common.mvp.BaseView
import com.fly.tour.common.util.NetUtil
import com.fly.tour.common.util.log.KLog
import com.fly.tour.common.view.LoadingInitView
import com.fly.tour.common.view.LoadingTransView
import com.fly.tour.common.view.NetErrorView
import com.fly.tour.common.view.NoDataView
import com.trello.rxlifecycle2.components.support.RxAppCompatActivity
import org.greenrobot.eventbus.EventBus
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
/**
* Description:
* Author: mxdl
* Date: 2018/1/15
* Version: V1.0.0
* Update:
*/
abstract class BaseFragment : Fragment(), BaseView {
protected lateinit var mActivity: RxAppCompatActivity
protected lateinit var mView: View
protected var mTxtTitle: TextView? = null
protected var mToolbar: Toolbar? = null
protected var mNetErrorView: NetErrorView? = null
protected var mNoDataView: NoDataView? = null
protected var mLoadingInitView: LoadingInitView? = null
protected var mLoadingTransView: LoadingTransView? = null
private var mViewStubToolbar: ViewStub? = null
private var mViewStubContent: ViewStub? = null
private var mViewStubInitLoading: ViewStub? = null
private var mViewStubTransLoading: ViewStub? = null
private var mViewStubNoData: ViewStub? = null
private var mViewStubError: ViewStub? = null
private var isViewCreated = false
private var isViewVisable = false
abstract val toolbarTitle: String
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mActivity = (activity as RxAppCompatActivity?)!!
ARouter.getInstance().inject(this)
EventBus.getDefault().register(this)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
mView = inflater.inflate(R.layout.fragment_root, container, false)
initCommonView(mView)
return mView
}
open fun initCommonView(view: View) {
mViewStubToolbar = view.findViewById(R.id.view_stub_toolbar)
mViewStubContent = view.findViewById(R.id.view_stub_content)
mViewStubContent = view.findViewById(R.id.view_stub_content)
mViewStubInitLoading = view.findViewById(R.id.view_stub_init_loading)
mViewStubTransLoading = view.findViewById(R.id.view_stub_trans_loading)
mViewStubNoData = view.findViewById(R.id.view_stub_nodata)
mViewStubError = view.findViewById(R.id.view_stub_error)
if (enableToolbar()) {
mViewStubToolbar!!.layoutResource = onBindToolbarLayout()
val viewTooBbar = mViewStubToolbar!!.inflate()
initTooBar(viewTooBbar)
}
mViewStubContent!!.layoutResource = onBindLayout()
mViewStubContent!!.inflate()
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
//initView(mView)
initListener()
isViewCreated = true
//如果启用了懒加载就进行懒加载,否则就进行预加载
if (enableLazyData()) {
lazyLoad()
} else {
initData()
}
}
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
isViewVisable = isVisibleToUser
//如果启用了懒加载就进行懒加载,
if (enableLazyData() && isViewVisable) {
lazyLoad()
}
}
private fun lazyLoad() {
//这里进行双重标记判断,必须确保onCreateView加载完毕且页面可见,才加载数据
KLog.v("MYTAG", "lazyLoad start...")
KLog.v("MYTAG", "isViewCreated:$isViewCreated")
KLog.v("MYTAG", "isViewVisable$isViewVisable")
if (isViewCreated && isViewVisable) {
initData()
//数据加载完毕,恢复标记,防止重复加载
isViewCreated = false
isViewVisable = false
}
}
//默认不启用懒加载
open fun enableLazyData(): Boolean {
return false
}
override fun onDestroy() {
super.onDestroy()
EventBus.getDefault().unregister(this)
}
protected fun initTooBar(view: View) {
mToolbar = view.findViewById(R.id.toolbar_root)
mTxtTitle = view.findViewById(R.id.toolbar_title)
if (mToolbar != null) {
mActivity.setSupportActionBar(mToolbar)
mActivity.supportActionBar!!.setDisplayShowTitleEnabled(false)
mToolbar!!.setNavigationOnClickListener { mActivity.onBackPressed() }
}
if (mTxtTitle != null) {
mTxtTitle!!.text = toolbarTitle
}
}
@Subscribe(threadMode = ThreadMode.MAIN)
fun onEvent(event: BaseFragmentEvent) {
}
abstract fun onBindLayout(): Int
abstract override fun initData()
override fun initListener() {}
override fun finishActivity() {
mActivity.finish()
}
fun enableToolbar(): Boolean {
return false
}
fun onBindToolbarLayout(): Int {
return R.layout.common_toolbar
}
override fun showInitLoadView() {
showInitLoadView(true)
}
override fun hideInitLoadView() {
showInitLoadView(false)
}
override fun showTransLoadingView() {
showTransLoadingView(true)
}
override fun hideTransLoadingView() {
showTransLoadingView(false)
}
override fun showNoDataView() {
showNoDataView(true)
}
override fun showNoDataView(resid: Int) {
showNoDataView(true, resid)
}
override fun hideNoDataView() {
showNoDataView(false)
}
override fun showNetWorkErrView() {
showNetWorkErrView(true)
}
override fun hideNetWorkErrView() {
showNetWorkErrView(false)
}
private fun showInitLoadView(show: Boolean) {
if (mLoadingInitView == null) {
val view = mViewStubInitLoading!!.inflate()
mLoadingInitView = view.findViewById(R.id.view_init_loading)
}
mLoadingInitView!!.visibility = if (show) View.VISIBLE else View.GONE
mLoadingInitView!!.loading(show)
}
private fun showNetWorkErrView(show: Boolean) {
if (mNetErrorView == null) {
val view = mViewStubError!!.inflate()
mNetErrorView = view.findViewById(R.id.view_net_error)
mNetErrorView!!.setOnClickListener(View.OnClickListener {
if (!NetUtil.checkNetToast()) {
return@OnClickListener
}
hideNetWorkErrView()
initData()
})
}
mNetErrorView!!.visibility = if (show) View.VISIBLE else View.GONE
}
private fun showNoDataView(show: Boolean) {
if (mNoDataView == null) {
val view = mViewStubNoData!!.inflate()
mNoDataView = view.findViewById(R.id.view_no_data)
}
mNoDataView!!.visibility = if (show) View.VISIBLE else View.GONE
}
private fun showNoDataView(show: Boolean, resid: Int) {
showNoDataView(show)
if (show) {
mNoDataView!!.setNoDataView(resid)
}
}
private fun showTransLoadingView(show: Boolean) {
if (mLoadingTransView == null) {
val view = mViewStubTransLoading!!.inflate()
mLoadingTransView = view.findViewById(R.id.view_trans_loading)
}
mLoadingTransView!!.visibility = if (show) View.VISIBLE else View.GONE
mLoadingTransView!!.loading(show)
}
companion object {
protected val TAG = BaseFragment::class.java!!.getSimpleName()
}
}