This repository was archived by the owner on Jun 15, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathViewPagerFragment.kt
More file actions
119 lines (102 loc) · 4.32 KB
/
ViewPagerFragment.kt
File metadata and controls
119 lines (102 loc) · 4.32 KB
1
2
3
4
5
6
7
8
9
10
11
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package com.example.android.navigationsamples
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.Toolbar
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.commitNow
import androidx.lifecycle.Lifecycle
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.fragment.findNavController
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.adapter.FragmentStateAdapter.FragmentTransactionCallback.OnPostEventListener
import androidx.viewpager2.widget.ViewPager2
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator
class ViewPagerFragment : Fragment() {
private lateinit var viewPager: ViewPager2
private lateinit var tabLayoutMediator: TabLayoutMediator
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_view_pager, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupViewPager(view)
}
// Needed to avoid memory leaks
// see: https://stackoverflow.com/a/62861424
// and: https://stackoverflow.com/a/62184494
override fun onDestroy() {
viewPager.adapter = null
tabLayoutMediator.detach()
super.onDestroy()
}
private fun setupViewPager(view: View) {
val labels = listOf("Home", "Leaderboard", "Register")
val navGraphIds = listOf(R.navigation.home, R.navigation.list, R.navigation.form)
val navHostFragmentAdapter = NavHostFragmentAdapter(
fragmentManager = childFragmentManager,
lifecycle = viewLifecycleOwner.lifecycle,
navGraphIds = navGraphIds
)
viewPager = view.findViewById(R.id.view_pager)
viewPager.adapter = navHostFragmentAdapter
val tabLayout = view.findViewById<TabLayout>(R.id.view_pager_tab_layout)
tabLayoutMediator = TabLayoutMediator(tabLayout, viewPager) { tab, position ->
tab.text = (labels[position])
}
tabLayoutMediator.attach()
addToolbarListener(view.findViewById(R.id.view_pager_toolbar))
}
private fun addToolbarListener(toolbar: Toolbar) {
toolbar.setOnMenuItemClickListener { menuItem ->
when (menuItem.itemId) {
R.id.settings -> {
findNavController().navigate(R.id.settings)
true
}
else -> false
}
}
}
}
// Also see https://stackoverflow.com/a/64033693
class NavHostFragmentAdapter(
fragmentManager: FragmentManager,
lifecycle: Lifecycle,
private val navGraphIds: List<Int>
) : // Use this constructor to avoid this issue: https://stackoverflow.com/a/62184494
FragmentStateAdapter(fragmentManager, lifecycle) {
init {
// Needs: "androidx.viewpager2:viewpager2:1.1.0-alpha01" or higher
// Taken from: https://stackoverflow.com/a/62629996
// Add a FragmentTransactionCallback to handle changing
// the primary navigation fragment
registerFragmentTransactionCallback(object : FragmentTransactionCallback() {
override fun onFragmentMaxLifecyclePreUpdated(
fragment: Fragment,
maxLifecycleState: Lifecycle.State
) = if (maxLifecycleState == Lifecycle.State.RESUMED) {
// This fragment is becoming the active Fragment - set it to
// the primary navigation fragment in the OnPostEventListener
OnPostEventListener {
fragment.parentFragmentManager.commitNow {
setPrimaryNavigationFragment(fragment)
}
}
} else {
super.onFragmentMaxLifecyclePreUpdated(fragment, maxLifecycleState)
}
})
}
override fun createFragment(position: Int): Fragment {
// Return a NEW fragment instance in createFragment(int)
return NavHostFragment.create(navGraphIds[position])
}
override fun getItemCount(): Int = navGraphIds.size
}