Jetpack Navigation 在 activity 之前初始化片段:因此 ui 操作崩溃

Jetpack Navigation initializes the fragment before the activity: so ui actions crash

我将我的项目更新为 kotlin 1.5.20 和这样的 Jetpack 导航

    implementation "androidx.navigation:navigation-fragment-ktx:2.3.5"
    implementation "androidx.navigation:navigation-ui-ktx:2.3.5"

现在我的应用程序崩溃了。原因有点奇怪。在我的 startDestination-Fragment 中,我对 activity 进行了 UI 操作。例如,根据最后的分数,片段必须调整标题。所以没什么特别的。

应用程序崩溃,因为 xml 无法充气:

     Caused by: android.view.InflateException: Binary XML file line #83: Error inflating class fragment
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference

包括片段到activity是标准代码:

 <fragment
        android:id="@+id/nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:defaultNavHost="true"
        <!-- ... some- constraint stuff -->
        app:navGraph="@navigation/nav_graph" />

我在片段中的 activity 和 onViewCreated 中的 onCreate 中放置了一条日志消息。我的日志显示了一个奇怪的生命周期:

2021-07-10 17:42:08.097 28021-28021/com.x E/Lifecycle: Create Game Fragment
2021-07-10 17:42:08.141 28021-28021/com.x E/Lifecycle: Create Game Holder Activity

到目前为止,我的假设是 activity 先初始化,然后再初始化片段。我本来希望日志完全按照其他顺序排列。 “修复”非常老套。

   override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        Log.e("Lifecycle", "Create Game Fragment")
        lifecycleScope.launch {
           // delay(1)
            doActivityUIChanges()
        }

    }

当我使用 delay(1) 时一切正常。当我不使用延迟时,应用程序崩溃了。

真的很奇怪。我误解了生命周期吗?我真的很感激另一个解决方案。我的修复不是很干净哈哈

替换您的标签 不清楚为什么,但是建议按照官方文档做:https://developer.android.com/guide/navigation/navigation-getting-started