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方法æ‰?ä¼šè¢«è°ƒç”¨ï¼Œè¿™æ ·æ‰?符å?ˆæ–¹æ³•设计的åˆ?衷。 - 缺点:
- 对于 Fragment 的嵌套,�时使用了
setMaxLifecycle方法。å?Œçº§ä¸?å?¯è§?çš„Fragment, ä»?ç„¶è¦?调用onResume方法。 - 需è¦?在原有的 add+show+hide 方法ä¸ï¼Œç»§ç»è°ƒç”¨ setMaxLifecycle 方法æ?¥æŽ§åˆ¶Fragment 的最大生命状æ€?。
- 对于 Fragment 的嵌套,�时使用了
更多 �
å¦‚æžœä½ æƒ³äº†è§£å…¶ä¸çš„原ç?†ï¼Œä½ å?¯ä»¥é˜…è¯»è¯¥æ–‡ç« :
最�
å¦‚æžœä½ è§‰å¾—é¡¹ç›®ä¸?错,欢迎点击 star
�系我
- QQ:443696320
- 简书:AndyandJennifer
- 掘金:AndyandJennifer
- Email: andyjennifer@126.com