【问题标题】:Android Kotlin: Fragment not attached to a contextAndroid Kotlin:片段未附加到上下文
【发布时间】: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


    【解决方案1】:

    我刚刚在我的代码中修复了一个与您有些相似的错误。 出现同样的错误。 这个想法是我正在使用 getResources() 初始化一个字符串变量(不在 MainActivity)。 但是,变量没有被 context.getResources() 初始化

    我能够在 MainActivity 中初始化这个变量并将其设为静态,这样我就可以将值复制到变量不在 MainActivity 中

    所以,我认为您应该搜索使用 getResources 初始化的所有变量,看看您是否使用了上下文。

    【讨论】:

      猜你喜欢
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多