Переход фрагмента приводит к краху - PullRequest
2 голосов
/ 17 июня 2019

Я изменяю фрагменты с анимацией, проводя по экрану вправо или влево.Вот родительский фрагмент:

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()
    }
}

Это прекрасно работает, но с одним исключением.Когда я выполняю fragTransaction, пока старый фрагментTransaction не закончил, он вылетает с «java.lang.IllegalStateException»: «Restarter должен быть создан только на этапе инициализации владельца»

Есть ли способ проверитьесли старая транзакция закончилась перед выполнением новой?

РЕДАКТИРОВАТЬ: Чтобы объяснить, что именно я хочу сделать:

Child Fragment 1

Child Fragment 2

Я хочу переключиться между этими двумя дочерними фрагментами, проведя пальцем по экрану к другому фрагменту или нажав «Сортировать по категориям / месяцам».

1 Ответ

1 голос
/ 17 июня 2019

вы не можете запустить фрагментную транзакцию, пока другая еще не завершена.Основываясь на том, что делает ваш код, будет несколько триггеров, когда пользователь проведет пальцем по вашему виду.Это приведет к быстрой транзакции нескольких фрагментов, и это приведет к сбою.

В вашем сценарии использования вы просто хотите переключаться между двумя фрагментами посредством считывания.На самом деле для этого есть виджет.

Он называется ViewPager .

См. Руководство на официальном сайте документации Android здесь .

Вы также можете использовать TabLayout с ViewPager , чтобы сделать именно то, что скриншот выше.

...