riku
2021-02-25 e102578ebfc95c27aeb13dce13fb82af53a2bead
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
package cn.flightfeather.thirdapp.module.base
 
import android.annotation.SuppressLint
import android.content.Intent
import android.os.Bundle
import android.support.v4.app.FragmentTransaction
import android.support.v7.widget.Toolbar
import cn.flightfeather.thirdapp.R
 
/**
 * @author riku
 * Date: 2019/4/16
 * 包含fragment的基类activity
 */
abstract class BaseFragmentListActivity : BaseActivity(){
 
    var lastFragmentPos = -1
 
    var fragments: ArrayList<BaseFragment>? = null
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        fragments = getFragmentList()
        initToolbar()
        navigateTo(0)
    }
 
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
//        fragments?.forEach { it.onActivityResult(requestCode, resultCode, data) }
    }
 
    private fun initToolbar() {
//        getToolBar()?.let { setSupportActionBar(it)}
    }
 
    //fragment切换
    @SuppressLint("CommitTransaction")
    open fun navigateTo(p: Int, reStart: Boolean = false, transaction: FragmentTransaction? = null) {
        fragments?.let {
            if (p >= it.size || p < 0) return
 
            (transaction ?: supportFragmentManager.beginTransaction())
                .apply {
                    if (lastFragmentPos >= 0 && lastFragmentPos < it.size) hide(it[lastFragmentPos])
                    if (!it[p].isAdded) {
                        add(getFragmentContainerID(), it[p], it[p].javaClass.simpleName)
                    }
                    show(it[p])
                }.commitAllowingStateLoss()
            lastFragmentPos = p
        }
    }
 
    @SuppressLint("CommitTransaction")
    fun navigateToNext(fragment: BaseFragment) {
        fragments?.add(fragment)
        if (fragments?.size ?: 0 > 1) {
            navigateTo((fragments?.size ?: 0) - 1,
                transaction = supportFragmentManager.beginTransaction().apply {
                    setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                    setCustomAnimations(R.anim.right_enter_2, R.anim.left_exit_3)
                })
        }
    }
 
    @SuppressLint("CommitTransaction")
    fun navigateBack() {
        if (fragments?.size ?: 0 > 1) {
            navigateTo((fragments?.size ?: 0) - 2,
                transaction = supportFragmentManager.beginTransaction().apply {
                    setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE)
                    setCustomAnimations(R.anim.left_enter_3, R.anim.right_exit_2)
                })
        }
        fragments?.removeAt(fragments?.size!! - 1)
    }
 
    /**
     * 将fragment 从导航栈中删除
     */
    fun deleteFragmentFromNavigation(fragment: BaseFragment) {
        fragments?.let {list ->
            if (list.contains(fragment)) {
                var index = 0
                for (i in 0 until list.size) {
                    if (list[i] == fragment) {
                        break
                    }
                    index++
                }
                fragments?.remove(fragment)
                if (lastFragmentPos >= index) {
                    lastFragmentPos -= 1
                }
            }
        }
    }
 
    abstract fun getFragmentList(): ArrayList<BaseFragment>?
 
    abstract fun getFragmentContainerID(): Int
 
//    abstract fun getToolBar(): Toolbar?
 
}