Правильный способ ожидания этого фрагмента виден - PullRequest
0 голосов
/ 26 мая 2019

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

fun respondToRematchInvitation(invitation : Invitation) {
    if (winFragment.isVisible) {
        val builder = AlertDialog.Builder(this)
        builder.setTitle("Accept invitation for rematch?")
        builder.setMessage("Are you sure?")
        builder.setPositiveButton("Yes") { _, _ ->
            turnBasedMultiplayerClient.acceptInvitation(invitation.invitationId)
                .addOnSuccessListener {
                    Log.d(TAG, "Invitation accepted succesfully")
                    isDoingTurn = false
                    gameFragment = GameFragment()
                    supportFragmentManager.beginTransaction().replace(R.id.fragment_container, gameFragment).addToBackStack(null).commit()
                    onInitiateMatch(it) //error happens here
                }.addOnFailureListener {
                    createFailureListener("Accepting invitation failed")
                }
        }

        val dialog : AlertDialog = builder.create()
        dialog.show()

Теперь в onInitiateMatch(it) у меня есть некоторый код, который модифицирует gameFragment, например, возможное получение игровых данных противников и другая инициализация. Простого использования if (gameFragment.isVisible) или if (gameFragment.isAdded) недостаточно, поскольку функция onInitiateMatch(it) может не выполняться, если этот оператор if возвращает false.

Должен ли я использовать темы для этого?

1 Ответ

0 голосов
/ 26 мая 2019

Оказалось, что выполнение supportFragmentManager.executePendingTransactions() решило проблему, я сначала подумал, что это не решение проблемы.

...