Fragment Transition 导致崩溃

Fragment Transition leads to crash

我通过向右或向左滑动屏幕来改变带有动画的片段。 这是 parent 片段:

class StatsFragment: Fragment() {

    private lateinit var tvSortCategories: TextView
    private lateinit var tvSortMonths: TextView
    private var x: Float? = null
    private val fragmentStatsCat = StatsCategoryFragment()
    private val fragmentStatsMon = StatsMonthFragment()


    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view: View = inflater.inflate(R.layout.fragment_stats, container, false)
        tvSortCategories = view.findViewById(R.id.tvStatsCategories)
        tvSortMonths = view.findViewById(R.id.tvStatsMonths)
        tvSortCategories.isSelected = true
        tvSortCategories.setOnClickListener {
            inflateCategory()
        }
        tvSortMonths.setOnClickListener {
            inflateMonth()
        }
        childFragmentManager.beginTransaction()
        .replace(R.id.stats_container, fragmentStatsCat)
        .commit()

        view.setOnTouchListener {_, event ->

            when(event.action) {
                MotionEvent.ACTION_DOWN -> {
                    x = event.x
                }
                MotionEvent.ACTION_MOVE -> {
                    if(x != null) {
                        val dx = event.x - x!!
                        if(dx > 200f) {
                            inflateCategory()
                            x = event.x
                        }
                        if (dx < -200f) {
                            inflateMonth()
                            x = event.x
                        }
                    }
                }
            }

            true
        }

        return view
    }

    private fun inflateCategory() {
        tvSortCategories.isSelected = true
        tvSortMonths.isSelected = false

        childFragmentManager.beginTransaction()
        .setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right)
        .replace(R.id.stats_container, fragmentStatsCat)
        .commit()
    }

    private fun inflateMonth() {
        tvSortCategories.isSelected = false
        tvSortMonths.isSelected = true

        childFragmentManager.beginTransaction()
        .setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left)
        .replace(R.id.stats_container, fragmentStatsMon)
        .commit()
    }
}

这很好用,但有一个例外。当我执行 fragmentTransaction 时,旧的 fragmentTransaction 尚未完成,它崩溃并显示“java.lang.IllegalStateException”:“Restarter must be created only during owner's initialization stage”

有什么方法可以在执行新交易之前检查旧交易是否已完成?

编辑:进一步解释我到底想做什么:

我想在这两个 Child 片段之间切换,方法是在屏幕上滑动到另一个片段,或者触摸“按 Categories/Months”排序。

您不能 运行 一个碎片交易,而另一个碎片交易仍在进行中。根据您的代码在做什么,当用户在您的视图上滑动时会有多个触发器。这将快速连续触发多个片段事务,这就是导致崩溃的原因。

在您的用例中,您只是想通过滑动在两个片段之间切换。实际上有一个小部件。

叫做ViewPager

在官方 android 文档站点 here 查看一些指南。

您还可以使用 TabLayoutViewPager 来制作上面的屏幕截图。