FragmentHostCallback.getContext() 引发空指针异常

8

当我通过深链接导航到在导航图文件中声明的Fragment时,我遇到了这个随机崩溃。我在项目中使用了导航组件库。

堆栈跟踪:

Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context androidx.fragment.app.FragmentHostCallback.getContext()' on a null object reference
   at androidx.fragment.app.FragmentLifecycleCallbacksDispatcher.dispatchOnFragmentPreAttached(FragmentLifecycleCallbacksDispatcher.java:91)
   at androidx.fragment.app.FragmentLifecycleCallbacksDispatcher.dispatchOnFragmentPreAttached(FragmentLifecycleCallbacksDispatcher.java:96)
   at androidx.fragment.app.FragmentStateManager.attach(FragmentStateManager.java:463)
   at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:275)
   at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2189)
   at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2106)
   at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002)
   at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:524)
   at android.os.Handler.handleCallback(Handler.java:938)
   at android.os.Handler.dispatchMessage(Handler.java:99)
   at android.os.Looper.loop(Looper.java:223)
   at android.app.ActivityThread.main(ActivityThread.java:7698)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:952)

你能展示一下你的代码吗? - Elikill58
@rahul-rastogi,你找到了解决这个崩溃的方法或者重现它的步骤吗? - Andriy D.
@AndriyD. 还没有! - Rahul Rastogi
伙计们,有运气了吗? - Anshul Tyagi
4个回答

0

在我的Activity的onCreate中,我漏掉了super.onCreate(savedInstanceState)。非常烦人的是错误描述不够具体。


0

对我来说问题是我使用了

supportFragmentManager
    .beginTransaction()
    .replace(R.id.fragment_container_view, MySettingsFragment())
    .commit()

在托管片段的活动中,与AndroidX导航组件一起使用。

您可以使用supportFragmentManager手动更改片段,也可以使用AndroidX导航。


0
我也遇到了这个崩溃问题,而且持续了很长时间。
当使用deeplink打开应用时,应用会崩溃。崩溃率大约为0.2%,在本地无法复现。
我暂时解决这个问题的方法是禁用自动启动deeplinks。
class MainActivity : AppCompatActivity() {
   override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      val curIntent = intent
      intent = null
      setContentView(R.layout.main_activity)
      intent = curIntent
      // launch deeplink by yourself
      curIntent.data.let {
        findNavController(R.id.container).navUrl(it)
      }
   }
}

0
我遇到了类似的错误。我花了很多时间寻找我的灵魂。在通过深链接导航到一个屏幕后(使用Google的导航组件),当返回导航时,导航会崩溃,如果该屏幕之前已经打开过。在我的情况下,在创建一个片段时,通过编程方式分配了一个日程安排。
  private fun setupNavGraph() {
      val Graph = navHostFragment.navController.navInflater.inflate(navGraphResId)
      startDestinationId?.let {graph.setStartDestination(it) }
      navHostFragment.navController.graph = graph
  }

但是当返回时,当恢复一个片段时,这段代码再次被调用并重新分配了图形。这导致了崩溃。 我添加了这行代码:
      if (navHostFragment.navController.hasGraph()) return

图表在哪里:

@Suppress("INESSENTIAL_COMPARISON")
fun NavController.hasGraph() = try {
      graph != null
} catch (t: Throwable) {
      false
}

为了防止对现有图表的重新分配。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接