【发布时间】:2020-07-10 07:26:31
【问题描述】:
我正在尝试使用具有不同片段的 TabLayout,并开始使用 AndroidStudio 为选项卡式布局自动生成的代码。我没有更改占位符片段的创建、显示、处理等方式:片段由 FragmentPagerAdapter 处理,ViewPaper 使用它,而 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(),但当我尝试在 PlaceholderFragment 中使用requireContext() 获取上下文时,java 会抛出以下异常:
java.lang.IllegalStateException: Fragment PlaceholderFragment{660c58b} (08f94c5f-64b3-4a50-a1d4-2f3a6c7b491c)} not attached to a context.
出于某种原因,上下文 在例如PlaceholderFragment 中的onResume():
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()
}
我找到了这个线程 Fragment not attached to a context,其中的解决方案是提交片段事务,但在这种情况下,所有这些似乎都是自动处理的。
【问题讨论】:
标签: android android-fragments kotlin android-viewpager android-context