Выполнить функцию после фиксации FragmentManager - PullRequest
1 голос
/ 06 февраля 2020

У меня есть панель инструментов с текстом, который обновляется после выбора элемента в моем меню.

Проблема в том, что я вызываю функцию, которая обрабатывает заголовок на моей панели инструментов сразу после моей транзакции, следующим образом:

supportFragmentManager.beginTransaction()
        .replace(R.id.fragment, fragment)
        .addToBackStack(null)
        .commit()
setTitle()

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

supportFragmentManager.fragments.last()

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

Ответы [ 2 ]

0 голосов
/ 06 февраля 2020

Если вы используете расширения KTX, вы можете дождаться создания фрагмента, используя LifecycleScope вместо непосредственного прослушивания менеджера фрагментов.

Сначала убедитесь, что у вас есть fragment-ktx зависимость на уровне приложения build.gradle:

dependencies {
    ...
    implementation 'androidx.fragment:fragment-ktx:1.2.1'
    ...
}

Затем вы можете выполнить приостановленное выполнение, ожидающее создания фрагмента:

supportFragmentManager.beginTransaction()
        .replace(R.id.fragment, fragment)
        .addToBackStack(null)
        .commit()
fragment.lifecycleScope.launchWhenCreated { 
    setTitle()
}
0 голосов
/ 06 февраля 2020

Поскольку вы не добавляете свой фрагмент в задний стек, вы не можете использовать встроенный FragmentManager.OnBackStackChangedListener, поэтому вместо этого вы можете либо вызвать executePendingTransactions() сразу после фиксации сделайте транзакцию или используйте метод commitNow() вместо commit(), чтобы сделать то же самое, затем обработайте изменения панели инструментов с помощью setTitle().

...