我将我的项目更新为kotlin 1.5.20
和类似的喷气背包导航
implementation "androidx.navigation:navigation-fragment-ktx:2.3.5"
implementation "androidx.navigation:navigation-ui-ktx:2.3.5"
现在我的应用程序崩溃了。原因有点奇怪。在我的startDestination
-片段中,我有活动的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
将片段包含到活动中是标准代码:
<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" />
我在活动的onCreate
和片段的onViewCreated
中放置了一条日志消息。我的日志显示了一个奇怪的生命周期:
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
到目前为止,我的假设是活动首先初始化,然后初始化片段。我本以为登录的顺序正好相反。";"修复";非常暴躁。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
Log.e("Lifecycle", "Create Game Fragment")
lifecycleScope.launch {
// delay(1)
doActivityUIChanges()
}
}
当我使用delay(1)
时,一切都正常。当我不使用延迟时,应用程序就会崩溃。
这真的很奇怪。我是否误解了生命周期?我真的很感激另一个解决方案。我的修复不是很干净哈哈
将标记替换为<androidx.fragment.app.FragmentContainerView>原因尚不清楚,但建议根据官方文件进行:https://developer.android.com/guide/navigation/navigation-getting-started