├── .gitignore ├── .idea ├── codeStyles │ ├── Project.xml │ └── codeStyleConfig.xml ├── dictionaries │ └── andy.xml ├── encodings.xml ├── gradle.xml ├── misc.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── jennifer │ │ └── andy │ │ └── androidxlazyload │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── jennifer │ │ │ └── andy │ │ │ └── androidxlazyload │ │ │ ├── FragmentGenerater.kt │ │ │ ├── LazyFragment.kt │ │ │ ├── LogFragment.kt │ │ │ ├── MainActivity.kt │ │ │ ├── TraditionLazyFragment.kt │ │ │ ├── demo │ │ │ ├── adapter │ │ │ │ ├── FragmentLazyPagerAdapter.kt │ │ │ │ ├── FragmentLazyStateAdapter.kt │ │ │ │ └── FragmentLazyStatePageAdapter.kt │ │ │ ├── demo1 │ │ │ │ └── Activity1.kt │ │ │ ├── demo2 │ │ │ │ └── Activity2.kt │ │ │ ├── demo3 │ │ │ │ └── Activity3.kt │ │ │ ├── demo4 │ │ │ │ └── Activity4.kt │ │ │ ├── demo5 │ │ │ │ └── Activity5.kt │ │ │ ├── demo6 │ │ │ │ └── Activity6.kt │ │ │ └── demo7 │ │ │ │ └── Activity7.kt │ │ │ ├── ext │ │ │ └── ShowHideExt.kt │ │ │ └── fragment │ │ │ ├── AFragment.kt │ │ │ ├── BFragment.kt │ │ │ ├── CFragment.kt │ │ │ ├── FourFragment.kt │ │ │ ├── OneFragment.kt │ │ │ ├── TextFragment.kt │ │ │ ├── ThreeFragment.kt │ │ │ └── TwoFragment.kt │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ ├── activity_1.xml │ │ ├── activity_2.xml │ │ ├── activity_3.xml │ │ ├── activity_4.xml │ │ ├── activity_5.xml │ │ ├── activity_6.xml │ │ ├── activity_7.xml │ │ ├── activity_main.xml │ │ ├── fragment_a.xml │ │ ├── fragment_b.xml │ │ ├── fragment_c.xml │ │ ├── fragment_four.xml │ │ └── fragment_text.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── jennifer │ └── andy │ └── androidxlazyload │ └── ExampleUnitTest.kt ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 9 | 10 | 11 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | xmlns:android 20 | 21 | ^$ 22 | 23 | 24 | 25 |
26 |
27 | 28 | 29 | 30 | xmlns:.* 31 | 32 | ^$ 33 | 34 | 35 | BY_NAME 36 | 37 |
38 |
39 | 40 | 41 | 42 | .*:id 43 | 44 | http://schemas.android.com/apk/res/android 45 | 46 | 47 | 48 |
49 |
50 | 51 | 52 | 53 | .*:name 54 | 55 | http://schemas.android.com/apk/res/android 56 | 57 | 58 | 59 |
60 |
61 | 62 | 63 | 64 | name 65 | 66 | ^$ 67 | 68 | 69 | 70 |
71 |
72 | 73 | 74 | 75 | style 76 | 77 | ^$ 78 | 79 | 80 | 81 |
82 |
83 | 84 | 85 | 86 | .* 87 | 88 | ^$ 89 | 90 | 91 | BY_NAME 92 | 93 |
94 |
95 | 96 | 97 | 98 | .* 99 | 100 | http://schemas.android.com/apk/res/android 101 | 102 | 103 | ANDROID_ATTRIBUTE_ORDER 104 | 105 |
106 |
107 | 108 | 109 | 110 | .* 111 | 112 | .* 113 | 114 | 115 | BY_NAME 116 | 117 |
118 |
119 |
120 |
121 | 122 | 124 |
125 |
-------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/dictionaries/andy.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Android 12 | 13 | 14 | Android > Lint > Correctness 15 | 16 | 17 | Android > Lint > Internationalization 18 | 19 | 20 | Android > Lint > Security 21 | 22 | 23 | Android > Lint > Usability 24 | 25 | 26 | C/C++ 27 | 28 | 29 | Code maturity issuesJava 30 | 31 | 32 | Code style issuesJava 33 | 34 | 35 | Control FlowGroovy 36 | 37 | 38 | Control flow issuesJava 39 | 40 | 41 | Data flow issuesGroovy 42 | 43 | 44 | Error handlingJava 45 | 46 | 47 | General 48 | 49 | 50 | GeneralC/C++ 51 | 52 | 53 | Groovy 54 | 55 | 56 | J2ME issuesJava 57 | 58 | 59 | Java 60 | 61 | 62 | Java language level issuesJava 63 | 64 | 65 | Java language level migration aidsJava 66 | 67 | 68 | Javadoc issuesJava 69 | 70 | 71 | Memory issuesJava 72 | 73 | 74 | Performance issuesJava 75 | 76 | 77 | Portability issuesJava 78 | 79 | 80 | Potentially confusing code constructsGroovy 81 | 82 | 83 | Probable bugsGroovy 84 | 85 | 86 | Probable bugsJava 87 | 88 | 89 | Security issuesJava 90 | 91 | 92 | Threading issuesGroovy 93 | 94 | 95 | Threading issuesJava 96 | 97 | 98 | Unused codeC/C++ 99 | 100 | 101 | Validity issuesGroovy 102 | 103 | 104 | 105 | 106 | Android 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 118 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AndroidxLazyLoad 2 | 3 | AndroidxLazyLoad 是 Androidx 模式下 Fragment 懒加载的新实现,通过使用 `FragmentTransaction.setMaxLifecycle()` 方法来控制 Fragment 可调用的最大生命周期函数。 4 | 5 | 该项目中包含以下Fragment的使用场景 6 | 7 | - ViewPager + FragmentPagerAdapter 8 | - ViewPager + FragmentStatePagerAdapter 9 | - Activity + Fragment 10 | - Fragment + Fragment(嵌套模式) 11 | - 复杂 Fragment 嵌套 (上述4种场景的各种组合) 12 | - ViewPager2 + Fragment 13 | 14 | ## 如何使用? 15 | 16 | 使用该方案,你需要进行如下三步修改。 17 | 18 | ### 修改你的 ViewPager 适配器 19 | 20 | 在你的 ViewPager 适配器中增加如下参数: 21 | 22 | ```kotin 23 | FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) 24 | 25 | FragmentStatePagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) 26 | ``` 27 | 28 | ### 修改你的 add+show+hide 方法 29 | 30 | - 将需要显示的 Fragment ,在调用 add 或 show 方法后,`setMaxLifecycle(showFragment, Lifecycle.State.RESUMED)` 31 | - 将需要隐藏的 Fragment ,在调用 hide 方法后,`setMaxLifecycle(fragment, Lifecycle.State.STARTED)` 32 | 33 | 如下所示: 34 | 35 | ```kotlin 36 | /** 37 | * 使用add+show+hide模式加载fragment 38 | * 39 | * 默认显示位置[showPosition]的Fragment,最大Lifecycle为Lifecycle.State.RESUMED 40 | * 其他隐藏的Fragment,最大Lifecycle为Lifecycle.State.STARTED 41 | * 42 | *@param containerViewId 容器id 43 | *@param showPosition fragments 44 | *@param fragmentManager FragmentManager 45 | *@param fragments 控制显示的Fragments 46 | */ 47 | private fun loadFragmentsTransaction( 48 | @IdRes containerViewId: Int, 49 | showPosition: Int, 50 | fragmentManager: FragmentManager, 51 | vararg fragments: Fragment 52 | ) { 53 | if (fragments.isNotEmpty()) { 54 | fragmentManager.beginTransaction().apply { 55 | for (index in fragments.indices) { 56 | val fragment = fragments[index] 57 | add(containerViewId, fragment, fragment.javaClass.name) 58 | if (showPosition == index) { 59 | setMaxLifecycle(fragment, Lifecycle.State.RESUMED) 60 | } else { 61 | hide(fragment) 62 | setMaxLifecycle(fragment, Lifecycle.State.STARTED) 63 | } 64 | } 65 | 66 | }.commit() 67 | } else { 68 | throw IllegalStateException( 69 | "fragments must not empty" 70 | ) 71 | } 72 | } 73 | 74 | /** 显示需要显示的Fragment[showFragment],并设置其最大Lifecycle为Lifecycle.State.RESUMED。 75 | * 同时隐藏其他Fragment,并设置最大Lifecycle为Lifecycle.State.STARTED 76 | * @param fragmentManager 77 | * @param showFragment 78 | */ 79 | private fun showHideFragmentTransaction(fragmentManager: FragmentManager, showFragment: Fragment) { 80 | fragmentManager.beginTransaction().apply { 81 | show(showFragment) 82 | setMaxLifecycle(showFragment, Lifecycle.State.RESUMED) 83 | 84 | //获取其中所有的fragment,其他的fragment进行隐藏 85 | val fragments = fragmentManager.fragments 86 | for (fragment in fragments) { 87 | if (fragment != showFragment) { 88 | hide(fragment) 89 | setMaxLifecycle(fragment, Lifecycle.State.STARTED) 90 | } 91 | } 92 | }.commit() 93 | } 94 | ``` 95 | 96 | 完整代码请点击--->[ShowHideExt](https://github.com/AndyJennifer/AndroidxLazyLoad/blob/master/app/src/main/java/com/jennifer/andy/androidxlazyload/ext/ShowHideExt.kt) 97 | 98 | ### 创建你的懒加载Fragment 99 | 100 | ```kotlin 101 | abstract class LazyFragment : LogFragment() { 102 | 103 | private var isLoaded = false 104 | 105 | override fun onResume() { 106 | super.onResume() 107 | if (!isLoaded && !isHidden) { 108 | lazyInit() 109 | Log.d(TAG, "lazyInit:!!!!!!!") 110 | isLoaded = true 111 | } 112 | } 113 | 114 | override fun onDestroyView() { 115 | super.onDestroyView() 116 | isLoaded = false 117 | } 118 | 119 | abstract fun lazyInit() 120 | } 121 | ``` 122 | 123 | ## 使用该方案的优缺点 124 | 125 | - 优点:`在非特殊的情况下(缺点1)`,只有实际的可见 Fragment,其 `onResume` 方法才会被调用,这样才符合方法设计的初衷。 126 | - 缺点: 127 | 1. 对于 Fragment 的嵌套,及时使用了 `setMaxLifecycle` 方法。同级不可见的Fragment, 仍然要调用 `onResume` 方法。 128 | 2. 需要在原有的 add+show+hide 方法中,继续调用 setMaxLifecycle 方法来控制Fragment 的最大生命状态。 129 | 130 | ## 更多 👏 131 | 132 | 如果你想了解其中的原理,你可以阅读该文章: 133 | 134 | - [Androidx下Fragment的懒加载](https://andyjennifer.com/2020/01/19/Androidx下Fragment的懒加载/) 135 | 136 | ## 最后 137 | 138 | 如果你觉得项目不错,欢迎点击 star ❤️或 follow,也可以帮忙分享给你更多的朋友。你的支持与鼓励是给我继续做好该项目的最大动力。 139 | 140 | ## 联系我 141 | 142 | - QQ:443696320 143 | - 简书:[AndyandJennifer](https://www.jianshu.com/users/921c778fb5e1/timeline) 144 | - 掘金:[AndyandJennifer](https://juejin.im/user/5acc1ea06fb9a028bc2e0fc1) 145 | - Email: [andyjennifer@126.com](andyjennifer@126.com) 146 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | apply plugin: 'kotlin-android' 4 | 5 | apply plugin: 'kotlin-android-extensions' 6 | 7 | android { 8 | compileSdkVersion 29 9 | buildToolsVersion "29.0.2" 10 | defaultConfig { 11 | applicationId "com.jennifer.andy.androidxlazyload" 12 | minSdkVersion 21 13 | targetSdkVersion 29 14 | versionCode 1 15 | versionName "1.0" 16 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 17 | } 18 | buildTypes { 19 | release { 20 | minifyEnabled false 21 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 22 | } 23 | } 24 | } 25 | 26 | dependencies { 27 | implementation fileTree(dir: 'libs', include: ['*.jar']) 28 | implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" 29 | implementation 'androidx.appcompat:appcompat:1.1.0' 30 | implementation 'androidx.core:core-ktx:1.0.2' 31 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3' 32 | implementation 'androidx.viewpager2:viewpager2:1.0.0' 33 | implementation 'com.google.android.material:material:1.1.0-beta02' 34 | testImplementation 'junit:junit:4.12' 35 | androidTestImplementation 'androidx.test.ext:junit:1.1.1' 36 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' 37 | } 38 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/jennifer/andy/androidxlazyload/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.jennifer.andy.androidxlazyload 2 | 3 | import androidx.test.platform.app.InstrumentationRegistry 4 | import androidx.test.ext.junit.runners.AndroidJUnit4 5 | 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | import org.junit.Assert.* 10 | 11 | /** 12 | * Instrumented test, which will execute on an Android device. 13 | * 14 | * See [testing documentation](http://d.android.com/tools/testing). 15 | */ 16 | @RunWith(AndroidJUnit4::class) 17 | class ExampleInstrumentedTest { 18 | @Test 19 | fun useAppContext() { 20 | // Context of the app under test. 21 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 22 | assertEquals("com.jennifer.andy.androidxlazyload", appContext.packageName) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 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 | -------------------------------------------------------------------------------- /app/src/main/java/com/jennifer/andy/androidxlazyload/FragmentGenerater.kt: -------------------------------------------------------------------------------- 1 | package com.jennifer.andy.androidxlazyload 2 | 3 | import androidx.fragment.app.Fragment 4 | import com.jennifer.andy.androidxlazyload.fragment.* 5 | 6 | 7 | const val FRAGMENT_ONE = "fragment_one" 8 | const val FRAGMENT_TWO = "fragment_two" 9 | const val FRAGMENT_THREE = "fragment_three" 10 | 11 | const val FRAGMENT_A = "fragment_a" 12 | const val FRAGMENT_B = "fragment_b" 13 | const val FRAGMENT_C = "fragment_c" 14 | 15 | /** 16 | * 获取OneFragment、TwoFragment、ThreeFragment,该集合中的fragment不包含嵌套。 17 | */ 18 | fun generate123Fragments() = mapOf( 19 | FRAGMENT_ONE to OneFragment.newInstance(FRAGMENT_ONE), 20 | FRAGMENT_TWO to TwoFragment.newInstance(FRAGMENT_TWO), 21 | FRAGMENT_THREE to ThreeFragment.newInstance(FRAGMENT_THREE) 22 | ) 23 | 24 | /** 25 | * 获取OneFragment、TwoFragment、ThreeFragment的Title 26 | */ 27 | fun generate123FragmentTitles() = mutableListOf().apply { 28 | add(FRAGMENT_ONE) 29 | add(FRAGMENT_TWO) 30 | add(FRAGMENT_THREE) 31 | } 32 | 33 | 34 | /** 35 | * 获取AFragment、BFragment、CFragment 36 | */ 37 | fun generateABCFragments() = mapOf( 38 | FRAGMENT_A to AFragment.newInstance(), 39 | FRAGMENT_B to BFragment.newInstance(), 40 | FRAGMENT_C to CFragment.newInstance() 41 | ) 42 | 43 | /** 44 | * 获取AFragment、BFragment、CFragment的Title 45 | */ 46 | fun generateABCFragmentTitles() = mutableListOf().apply { 47 | add(FRAGMENT_A) 48 | add(FRAGMENT_B) 49 | add(FRAGMENT_C) 50 | } 51 | 52 | /** 53 | * 构建多个TextFragment 54 | */ 55 | fun generateTextFragments(amount: Int) = mutableListOf().apply { 56 | for (i in 0..amount) { 57 | add(TextFragment.newInstance("Fragment:${i+1}")) 58 | } 59 | } 60 | 61 | 62 | /** 63 | * 构建多个TextFragment的Title 64 | */ 65 | fun generateTextFragmentTitles(amount: Int) = mutableListOf().apply { 66 | for (i in 0..amount) { 67 | add("Fragment:${i+1}") 68 | } 69 | } -------------------------------------------------------------------------------- /app/src/main/java/com/jennifer/andy/androidxlazyload/LazyFragment.kt: -------------------------------------------------------------------------------- 1 | package com.jennifer.andy.androidxlazyload 2 | 3 | import android.util.Log 4 | 5 | 6 | /** 7 | * Author: andy.xwt 8 | * Date: 2020-01-14 14:44 9 | * Description: Androidx 下支持栏加载的fragment 10 | */ 11 | 12 | abstract class LazyFragment : LogFragment() { 13 | 14 | private var isLoaded = false 15 | 16 | override fun onResume() { 17 | super.onResume() 18 | if (!isLoaded && !isHidden) { 19 | lazyInit() 20 | Log.d(TAG, "lazyInit:!!!!!!!") 21 | isLoaded = true 22 | } 23 | } 24 | 25 | override fun onDestroyView() { 26 | super.onDestroyView() 27 | isLoaded = false 28 | } 29 | 30 | abstract fun lazyInit() 31 | 32 | } -------------------------------------------------------------------------------- /app/src/main/java/com/jennifer/andy/androidxlazyload/LogFragment.kt: -------------------------------------------------------------------------------- 1 | package com.jennifer.andy.androidxlazyload 2 | 3 | import android.content.Context 4 | import android.os.Bundle 5 | import android.util.Log 6 | import android.view.LayoutInflater 7 | import android.view.View 8 | import android.view.ViewGroup 9 | import androidx.fragment.app.Fragment 10 | 11 | 12 | /** 13 | * Author: andy.xwt 14 | * Date: 2020-01-14 18:29 15 | * Description: 负责打印日志的Fragment基类 16 | */ 17 | 18 | open class LogFragment : Fragment() { 19 | 20 | protected var TAG = javaClass.simpleName 21 | 22 | override fun onAttach(context: Context) { 23 | super.onAttach(context) 24 | Log.d(TAG, "onAttach: ") 25 | } 26 | 27 | override fun onCreate(savedInstanceState: Bundle?) { 28 | super.onCreate(savedInstanceState) 29 | Log.d(TAG, "onCreate: ") 30 | } 31 | 32 | 33 | override fun onViewCreated(view: View, savedInstanceState: Bundle?) { 34 | super.onViewCreated(view, savedInstanceState) 35 | Log.d(TAG, "onViewCreated: ") 36 | } 37 | 38 | override fun onCreateView( 39 | inflater: LayoutInflater, 40 | container: ViewGroup?, 41 | savedInstanceState: Bundle? 42 | ): View? { 43 | Log.d(TAG, "onCreateView: ") 44 | return super.onCreateView(inflater, container, savedInstanceState) 45 | } 46 | 47 | 48 | override fun onActivityCreated(savedInstanceState: Bundle?) { 49 | super.onActivityCreated(savedInstanceState) 50 | Log.d(TAG, "onActivityCreated: ") 51 | } 52 | 53 | override fun onStart() { 54 | super.onStart() 55 | Log.d(TAG, "onStart: ") 56 | } 57 | 58 | override fun onResume() { 59 | super.onResume() 60 | Log.d(TAG, "onResume: ") 61 | } 62 | 63 | override fun onPause() { 64 | super.onPause() 65 | Log.d(TAG, "onPause: ") 66 | } 67 | 68 | override fun onStop() { 69 | super.onStop() 70 | Log.d(TAG, "onStop: ") 71 | } 72 | 73 | override fun onDestroyView() { 74 | super.onDestroyView() 75 | Log.d(TAG, "onDestroyView: ") 76 | } 77 | 78 | override fun onDetach() { 79 | super.onDetach() 80 | Log.d(TAG, "onDetach: ") 81 | } 82 | 83 | override fun onHiddenChanged(hidden: Boolean) { 84 | super.onHiddenChanged(hidden) 85 | Log.d(TAG, "onHiddenChanged:hidden-->$hidden") 86 | } 87 | 88 | } -------------------------------------------------------------------------------- /app/src/main/java/com/jennifer/andy/androidxlazyload/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.jennifer.andy.androidxlazyload 2 | 3 | import android.content.Intent 4 | import android.os.Bundle 5 | import android.view.View 6 | import android.widget.Button 7 | import androidx.appcompat.app.AppCompatActivity 8 | import com.jennifer.andy.androidxlazyload.demo.demo1.Activity1 9 | import com.jennifer.andy.androidxlazyload.demo.demo2.Activity2 10 | import com.jennifer.andy.androidxlazyload.demo.demo3.Activity3 11 | import com.jennifer.andy.androidxlazyload.demo.demo4.Activity4 12 | import com.jennifer.andy.androidxlazyload.demo.demo5.Activity5 13 | import com.jennifer.andy.androidxlazyload.demo.demo6.Activity6 14 | import com.jennifer.andy.androidxlazyload.demo.demo7.Activity7 15 | 16 | class MainActivity : AppCompatActivity(), View.OnClickListener { 17 | 18 | override fun onCreate(savedInstanceState: Bundle?) { 19 | super.onCreate(savedInstanceState) 20 | setContentView(R.layout.activity_main) 21 | findViewById