Skip to content
master
Go to file
Code

Files

Permalink
Failed to load latest commit information.
Type
Name
Latest commit message
Commit time
 
 
app
 
 
 
 
 
 
 
 
 
 
 
 

README.md

AndroidxLazyLoad

AndroidxLazyLoad 是 Androidx 模�下 Fragment 懒加载的新实现,通过使用 FragmentTransaction.setMaxLifecycle() 方法�控制 Fragment �调用的最大生命周期函数。

该项目中包�以下Fragment的使用场景

  • ViewPager + FragmentPagerAdapter
  • ViewPager + FragmentStatePagerAdapter
  • Activity + Fragment
  • Fragment + Fragment(嵌套模å¼?)
  • å¤?æ?‚ Fragment 嵌套 (上述4ç§?场景的å?„ç§?组å?ˆ)
  • ViewPager2 + Fragment

如何使用?

使用该方案,你需�进行如下三步修改。

修改你的 ViewPager 适�器

在你的 ViewPager 适�器中增加如下�数:

FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) 

FragmentStatePagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)

修改你的 add+show+hide 方法

  • 将需è¦?显示的 Fragment ,在调用 add 或 show 方法å?Žï¼ŒsetMaxLifecycle(showFragment, Lifecycle.State.RESUMED)
  • 将需è¦?éš?è—?çš„ Fragment ,在调用 hide 方法å?Žï¼ŒsetMaxLifecycle(fragment, Lifecycle.State.STARTED)

如下所示:

/**
 * 使用add+show+hide模�加载fragment
 *
 * 默认显示�置[showPosition]的Fragment,最大Lifecycle为Lifecycle.State.RESUMED
 * 其他��的Fragment,最大Lifecycle为Lifecycle.State.STARTED
 *
 *@param containerViewId 容器id
 *@param showPosition  fragments
 *@param fragmentManager FragmentManager
 *@param fragments  控制显示的Fragments
 */
private fun loadFragmentsTransaction(
    @IdRes containerViewId: Int,
    showPosition: Int,
    fragmentManager: FragmentManager,
    vararg fragments: Fragment
) {
    if (fragments.isNotEmpty()) {
        fragmentManager.beginTransaction().apply {
            for (index in fragments.indices) {
                val fragment = fragments[index]
                add(containerViewId, fragment, fragment.javaClass.name)
                if (showPosition == index) {
                    setMaxLifecycle(fragment, Lifecycle.State.RESUMED)
                } else {
                    hide(fragment)
                    setMaxLifecycle(fragment, Lifecycle.State.STARTED)
                }
            }

        }.commit()
    } else {
        throw IllegalStateException(
            "fragments must not empty"
        )
    }
}

/** 显示需�显示的Fragment[showFragment],并设置其最大Lifecycle为Lifecycle.State.RESUMED。
 *  �时��其他Fragment,并设置最大Lifecycle为Lifecycle.State.STARTED
 * @param fragmentManager
 * @param showFragment
 */
private fun showHideFragmentTransaction(fragmentManager: FragmentManager, showFragment: Fragment) {
    fragmentManager.beginTransaction().apply {
        show(showFragment)
        setMaxLifecycle(showFragment, Lifecycle.State.RESUMED)

        //获�其中所有的fragment,其他的fragment进行��
        val fragments = fragmentManager.fragments
        for (fragment in fragments) {
            if (fragment != showFragment) {
                hide(fragment)
                setMaxLifecycle(fragment, Lifecycle.State.STARTED)
            }
        }
    }.commit()
}

完整代�请点击--->ShowHideExt

创建你的懒加载Fragment

abstract class LazyFragment : LogFragment() {

    private var isLoaded = false

    override fun onResume() {
        super.onResume()
        if (!isLoaded && !isHidden) {
            lazyInit()
            Log.d(TAG, "lazyInit:!!!!!!!")
            isLoaded = true
        }
    }

    override fun onDestroyView() {
        super.onDestroyView()
        isLoaded = false
    }

    abstract fun lazyInit()
}

使用该方案的优缺点

  • 优点:在é?žç‰¹æ®Šçš„æƒ…况下(缺点1),å?ªæœ‰å®žé™…çš„å?¯è§? Fragment,其 onResume 方法æ‰?会被调用,这样æ‰?符å?ˆæ–¹æ³•设计的åˆ?衷。
  • 缺点:
    1. 对于 Fragment 的嵌套,�时使用了 setMaxLifecycle 方法。�级���的Fragment, �然�调用 onResume 方法。
    2. 需�在原有的 add+show+hide 方法中,继续调用 setMaxLifecycle 方法�控制Fragment 的最大生命状�。

更多 �

如果你想了解其中的原�,你�以阅读该文章:

最�

如果你觉得项目�错,欢迎点击 star ��或 follow,也�以帮忙分享给你更多的朋�。你的支�与鼓励是给我继续�好该项目的最大动力。

�系我

About

😈😈Fragment lazy loading under the androix

Topics

Resources

Releases

No releases published

Packages

No packages published

Languages

You can’t perform that action at this time.