Я пытаюсь использовать TabLayout с различными фрагментами и начал с автоматически сгенерированного кода AndroidStudio для макета с вкладками. Я не изменил способ создания фрагмента заполнителя, его отображения, обработки и т. Д. c. Фрагмент обрабатывается FragmentPagerAdapter, который используется ViewPaper, который, в свою очередь, используется для настройки TabLayout.
В макет уже включен FAB. Его onClick выглядит следующим образом:
fab.setOnClickListener { view ->
val currentFragment: Fragment = sectionsPagerAdapter.getItem(viewPager.currentItem)
when (viewPager.currentItem) {
0 -> doSomething()
1 -> (currentFragment as PlaceholderFragment).fabOnClick()
else -> doSomethingElse()
}
}
Несмотря на то, что вышеприведенный код гарантирует, что fabOnClick()
вызывается только для текущего видимого фрагмента, когда я пытаюсь получить контекст, используя requireContext()
в PlaceholderFragment, java выдает следующее исключение:
java.lang.IllegalStateException: Fragment PlaceholderFragment{660c58b} (08f94c5f-64b3-4a50-a1d4-2f3a6c7b491c)} not attached to a context.
По некоторым причинам контекст имеет значение , например, доступно в onResume()
в PlaceholderFragment:
override fun onResume() {
super.onResume()
// Works fine
Toast.makeText(requireContext(), "placeholder", Toast.LENGTH_LONG).show()
}
fun fabOnClick() {
// Throws exception
Toast.makeText(requireContext(), "placeholder", Toast.LENGTH_SHORT).show()
}
I нашел этот поток, Фрагмент, не привязанный к контексту , в котором решение заключалось в том, чтобы зафиксировать транзакцию фрагмента, но все это, кажется, обрабатывается автоматически в этом случае.