/
NavigationManager.kt
92 lines (73 loc) · 2.36 KB
/
NavigationManager.kt
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
package ir.oviessi.singleactivitypattern
import android.app.Activity
import android.R.anim.slide_out_right
import android.R.anim.slide_in_left
import android.app.FragmentContainer
import android.support.v4.app.Fragment
import android.support.v4.app.FragmentManager
import android.text.TextUtils.replace
/**
* Created by abbas on 1/22/18.
*/
class NavigationManager(private val mFragmentManager: FragmentManager,private val container: Int) {
init {
mFragmentManager.addOnBackStackChangedListener{
navigationListener?.invoke()
}
}
val isRootFragmentVisible: Boolean
get() = mFragmentManager.backStackEntryCount <= 1
/**
* Listener interface for navigation events.
*/
var navigationListener:(()->Unit)?=null
/**
* Displays the next fragment
*
* @param fragment
*/
fun open(fragment: Fragment) {
mFragmentManager.beginTransaction()
openFragment(fragment,true)
}
private fun openFragment(fragment: Fragment,addToBackStack:Boolean) {
val fragTransaction=mFragmentManager.beginTransaction()
fragTransaction.replace(container, fragment)
fragTransaction.setCustomAnimations(R.anim.slide_in_left,
R.anim.slide_out_right,
R.anim.slide_in_right,
R.anim.slide_out_left)
if (addToBackStack)
fragTransaction.addToBackStack(fragment.toString())
fragTransaction.commit()
}
/**
* pops every fragment and starts the given fragment as a new one.
*
* @param fragment
*/
fun openAsRoot(fragment: Fragment) {
popEveryFragment()
openFragment(fragment,false)
}
/**
* Pops all the queued fragments
*/
private fun popEveryFragment() {
// Clear all back stack.
val backStackCount = mFragmentManager.backStackEntryCount
for (i in 0 until backStackCount) {
// Get the back stack fragment id.
val backStackId = mFragmentManager.getBackStackEntryAt(i).id
mFragmentManager.popBackStack(backStackId, FragmentManager.POP_BACK_STACK_INCLUSIVE)
}
}
fun navigateBack():Boolean {
if (mFragmentManager.backStackEntryCount==0) {
return false
} else {
mFragmentManager.popBackStackImmediate()
return true
}
}
}