Skip to content

Commit 004ec0c

Browse files
Add nested navigation example and fixes
1 parent 7245489 commit 004ec0c

File tree

177 files changed

+2643
-1238
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

177 files changed

+2643
-1238
lines changed

Tutorial0-MaterialDesign/src/androidTest/java/com/smarttoolfactory/tutorial0_materialdesign/ExampleInstrumentedTest.kt

Lines changed: 0 additions & 24 deletions
This file was deleted.

Tutorial0-MaterialDesign/src/main/java/com/smarttoolfactory/tutorial0_materialdesign/blankfragment/BaseDataBindingFragment.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ abstract class BaseDataBindingFragment<ViewBinding : ViewDataBinding> : Fragment
2222
): View? {
2323
// Inflate the layout for this fragment
2424
dataBinding = DataBindingUtil.inflate(inflater, getLayoutRes(), container, false)
25+
2526
return dataBinding.root
2627
}
2728

Tutorial0-MaterialDesign/src/main/java/com/smarttoolfactory/tutorial0_materialdesign/blankfragment/GenericFragment.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class GenericFragment : BaseDataBindingFragment<FragmentGenericBinding>() {
5555
println("💀 $fragmentName onDestroy() id: $fragID, this: $this")
5656
}
5757

58+
5859
companion object {
5960

6061
const val ARG_POSITION = "position"

Tutorial0-MaterialDesign/src/main/java/com/smarttoolfactory/tutorial0_materialdesign/blankfragment/GenericFragmentParent.kt

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package com.smarttoolfactory.tutorial0_materialdesign.blankfragment
22

3+
import android.content.Context
34
import android.os.Bundle
45
import android.view.LayoutInflater
56
import android.view.View
67
import android.view.ViewGroup
7-
import androidx.fragment.app.add
8+
import androidx.fragment.app.Fragment
89
import androidx.fragment.app.commit
910
import androidx.fragment.app.replace
1011
import com.smarttoolfactory.tutorial0_materialdesign.R
@@ -62,6 +63,24 @@ class GenericFragmentParent(private val fragID: Int) :
6263

6364
}
6465

66+
67+
override fun onActivityCreated(savedInstanceState: Bundle?) {
68+
super.onActivityCreated(savedInstanceState)
69+
}
70+
71+
override fun onAttach(context: Context) {
72+
super.onAttach(context)
73+
74+
}
75+
76+
override fun onAttachFragment(childFragment: Fragment) {
77+
super.onAttachFragment(childFragment)
78+
}
79+
80+
override fun onDetach() {
81+
super.onDetach()
82+
}
83+
6584
override fun onDestroyView() {
6685
super.onDestroyView()
6786
println("👻 $fragmentName onDestroyView() id: $fragID, this: $this")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.smarttoolfactory.tutorial0_materialdesign.chapter0_nested_fragments
2+
3+
import android.os.Bundle
4+
import androidx.appcompat.app.AppCompatActivity
5+
6+
class Activity0NestedFragments : AppCompatActivity() {
7+
8+
9+
override fun onCreate(savedInstanceState: Bundle?) {
10+
super.onCreate(savedInstanceState)
11+
12+
}
13+
14+
}

Tutorial0-MaterialDesign/src/main/java/com/smarttoolfactory/tutorial0_materialdesign/chapter2_1viewpager2_fragments/Activity2_1ViewPagerFragmentAdapter.kt

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,7 @@ class Activity2_1ViewPagerFragmentAdapter : AppCompatActivity() {
8787
// position: Int,
8888
// positionOffset: Float,
8989
// positionOffsetPixels: Int
90-
// ) {
91-
// println(
92-
// "🤪 ViewPager2.OnPageChangeCallback() onPageScrolled() position: $position, " +
93-
// "positionOffset: $positionOffset, " +
94-
// "positionOffsetPixels: $positionOffsetPixels"
95-
// )
96-
//
97-
// }
90+
// ) {}
9891
//
9992
// override fun onPageScrollStateChanged(state: Int) {}
10093

Tutorial0-MaterialDesign/src/main/java/com/smarttoolfactory/tutorial0_materialdesign/chapter2_1viewpager2_fragments/Activity2_3ViewPagerInsideFragment.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class Activity2_3ViewPagerInsideFragment : AppCompatActivity() {
3131

3232
setSupportActionBar(dataBinding.toolbar)
3333

34-
createFragment()
34+
createRootFragment()
3535

3636
/*
3737
Add a back stack listener to check number of fragments to display top back button
@@ -56,7 +56,10 @@ class Activity2_3ViewPagerInsideFragment : AppCompatActivity() {
5656
}
5757
}
5858

59-
private fun createFragment() {
59+
/**
60+
* Create root fragment for this Activity
61+
*/
62+
private fun createRootFragment() {
6063

6164
// ✅ Replace Fragment with Java Style
6265
// supportFragmentManager.beginTransaction()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package com.smarttoolfactory.tutorial0_materialdesign.chapter2_1viewpager2_fragments
2+
3+
import android.os.Bundle
4+
import android.widget.Toast
5+
import androidx.appcompat.app.AppCompatActivity
6+
import androidx.databinding.DataBindingUtil
7+
import androidx.fragment.app.commit
8+
import androidx.fragment.app.replace
9+
import com.smarttoolfactory.tutorial0_materialdesign.R
10+
import com.smarttoolfactory.tutorial0_materialdesign.blankfragment.FragmentThatContainsViewPager
11+
import com.smarttoolfactory.tutorial0_materialdesign.databinding.Activity23viewpagerInFragmentBinding
12+
import com.smarttoolfactory.tutorial0_materialdesign.fragment_factory.GenericFragmentFactory
13+
14+
class Activity2_4ViewPagerFragmentState : AppCompatActivity() {
15+
16+
lateinit var dataBinding: Activity23viewpagerInFragmentBinding
17+
18+
override fun onCreate(savedInstanceState: Bundle?) {
19+
20+
/*
21+
⚠️ FragmentFactory should be placed before super.onCreate to be able
22+
find non-empty constructors of fragments
23+
*/
24+
supportFragmentManager.fragmentFactory = GenericFragmentFactory.getFragmentFactory()
25+
26+
super.onCreate(savedInstanceState)
27+
dataBinding =
28+
DataBindingUtil.setContentView(this, R.layout.activity2_3viewpager_in_fragment)
29+
30+
dataBinding.toolbar.title = "ViewPager Inside Fragment"
31+
32+
setSupportActionBar(dataBinding.toolbar)
33+
34+
35+
/*
36+
Add a back stack listener to check number of fragments to display top back button
37+
*/
38+
supportFragmentManager.addOnBackStackChangedListener {
39+
40+
val fragmentOnTop = supportFragmentManager.findFragmentById(
41+
R.id.fragment_container_view
42+
)
43+
44+
val fragmentCount = supportFragmentManager.backStackEntryCount
45+
46+
Toast.makeText(
47+
this@Activity2_4ViewPagerFragmentState,
48+
// Check fragment count and fragment on top of the stack for fragment_container_view
49+
"Activity fragmentCount: $fragmentCount, current Frag: $fragmentOnTop",
50+
Toast.LENGTH_SHORT
51+
).show()
52+
53+
supportActionBar?.setDisplayHomeAsUpEnabled(fragmentCount > 0)
54+
55+
}
56+
}
57+
58+
/**
59+
* Create root fragment for this Activity
60+
*/
61+
private fun createRootFragment() {
62+
63+
// ✅ Replace Fragment with DSL style
64+
supportFragmentManager.commit {
65+
replace<FragmentThatContainsViewPager>(R.id.fragment_container_view)
66+
}
67+
}
68+
69+
override fun onSupportNavigateUp(): Boolean {
70+
supportFragmentManager.popBackStack()
71+
return true
72+
}
73+
74+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package com.smarttoolfactory.tutorial0_materialdesign.chapter2_1viewpager2_fragments
2+
3+
import android.os.Bundle
4+
import android.widget.Toast
5+
import androidx.appcompat.app.AppCompatActivity
6+
import androidx.databinding.DataBindingUtil
7+
import androidx.fragment.app.commit
8+
import androidx.fragment.app.replace
9+
import com.smarttoolfactory.tutorial0_materialdesign.R
10+
import com.smarttoolfactory.tutorial0_materialdesign.blankfragment.FragmentThatContainsViewPager
11+
import com.smarttoolfactory.tutorial0_materialdesign.databinding.Activity23viewpagerInFragmentBinding
12+
import com.smarttoolfactory.tutorial0_materialdesign.fragment_factory.GenericFragmentFactory
13+
14+
class Activity2_5ViewPagerChildFragments : AppCompatActivity() {
15+
16+
lateinit var dataBinding: Activity23viewpagerInFragmentBinding
17+
18+
override fun onCreate(savedInstanceState: Bundle?) {
19+
20+
/*
21+
⚠️ FragmentFactory should be placed before super.onCreate to be able
22+
find non-empty constructors of fragments
23+
*/
24+
supportFragmentManager.fragmentFactory = GenericFragmentFactory.getFragmentFactory()
25+
26+
super.onCreate(savedInstanceState)
27+
dataBinding =
28+
DataBindingUtil.setContentView(this, R.layout.activity2_3viewpager_in_fragment)
29+
30+
dataBinding.toolbar.title = "ViewPager Inside Fragment"
31+
32+
setSupportActionBar(dataBinding.toolbar)
33+
34+
createRootFragment()
35+
36+
/*
37+
Add a back stack listener to check number of fragments to display top back button
38+
*/
39+
supportFragmentManager.addOnBackStackChangedListener {
40+
41+
val fragmentOnTop = supportFragmentManager.findFragmentById(
42+
R.id.fragment_container_view
43+
)
44+
45+
val fragmentCount = supportFragmentManager.backStackEntryCount
46+
47+
Toast.makeText(
48+
this@Activity2_5ViewPagerChildFragments,
49+
// Check fragment count and fragment on top of the stack for fragment_container_view
50+
"Activity fragmentCount: $fragmentCount, current Frag: $fragmentOnTop",
51+
Toast.LENGTH_SHORT
52+
).show()
53+
54+
supportActionBar?.setDisplayHomeAsUpEnabled(fragmentCount > 0)
55+
56+
}
57+
}
58+
59+
/**
60+
* Create root fragment for this Activity
61+
*/
62+
private fun createRootFragment() {
63+
64+
// ✅ Replace Fragment with Java Style
65+
// supportFragmentManager.beginTransaction()
66+
// .replace(
67+
// R.id.fragment_container_view,
68+
// FragmentThatContainsViewPager::class.java,
69+
// Bundle()
70+
// )
71+
// .commit()
72+
73+
// ✅ Replace Fragment with DSL style
74+
supportFragmentManager.commit {
75+
replace<FragmentThatContainsViewPager>(R.id.fragment_container_view)
76+
// Using addToBackStack makes backStackEntryCount 1
77+
// .addToBackStack(null)
78+
}
79+
}
80+
81+
override fun onSupportNavigateUp(): Boolean {
82+
supportFragmentManager.popBackStack()
83+
return true
84+
}
85+
86+
}

Tutorial1-1Navigation-NavGraph/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
apply plugin: 'com.android.application'
22
apply plugin: 'kotlin-android'
3+
apply plugin: 'kotlin-kapt'
34
apply plugin: 'kotlin-android-extensions'
45

56
android {
67
compileSdkVersion rootProject.compileSdkVersion
78
defaultConfig {
8-
applicationId "com.smarttoolfactory.navigationworkmanagerpagination"
99
minSdkVersion rootProject.minSdkVersion
1010
targetSdkVersion rootProject.targetSdkVersion
1111
versionCode 1

0 commit comments

Comments
 (0)