Android NavController: изменение порядка обратных вызовов onResume / onPause - PullRequest
0 голосов
/ 03 апреля 2020

Я борюсь с очень странным поведением навигационной библиотеки android.

Я создал фрагмент с этими обратными вызовами (для отображения полноэкранного содержимого фактическое переключение пользовательского интерфейса системы реализовано в * 1003). *):

class FullscreenFragment : Fragment() {
    ...
    override fun onResume() {
        super.onResume()
        activity.setFullscreen(true)
    }

    override fun onPause() {
        super.onPause()
        activity.setFullscreen(false)
    }
    ...

}

Допустим, у нас есть 2 разных фрагмента, FragmentA и FragmentB оба наследуют это FullscreenFragment.

Проблема возникает, когда я перехожу с FragmentA FragmentB с использованием метода NavController.navigate - в этом случае FragmentB.onResume вызывается ДО FragmentA.onPause. Это приводит к отключению полноэкранного режима после завершения перехода. То же самое происходит, когда я возвращаюсь от FragmentB к FragmentA - FragmentA.onResume идет до FragmentB.onPause.

Я подозреваю, что это происходит из-за реализации androidx.navigation.fragment.FragmentNavigator, которая вызывает ft.setReorderingAllowed(true); внутри метода public NavDestination navigate, непосредственно перед фиксацией транзакции фрагмента.

В чем причина того, что этот вызов жестко закодирован в реальной частной реализации? Есть ли способ преодолеть эту проблему (кроме реализации пользовательского FragmentNavigator) и использовать естественный порядок обратных вызовов жизненного цикла?

Заранее спасибо!

1 Ответ

0 голосов
/ 03 апреля 2020

Вы можете увеличить счетчик в onResume и уменьшить в onPause, а затем только setFullscreen(false), если он равен нулю.

Например:

class FullscreenFragment : Fragment() {
    ...
    private int fragmentCount = 0;
    override fun onResume() {
        super.onResume();
        if (fragmentCount == 0) {
            activity.setFullscreen(true);
        }
        fragmentCount++;
    }

    override fun onPause() {
        super.onPause();
        fragmentCount--;
        if (fragmentCount == 0) {
            activity.setFullscreen(false);
        }
    }
    ...

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...