问题描述
我正在构建一个具有与我的 app
应用程序模块处于同一级别的功能模块的 Android 应用程序,为了获得灵感,我正在查看一些在线存储库。
复制其中一个时,我注意到我的应用程序启动的生命周期略有不同。
我们都有一个只有 MainActivity
的清单,并且我们都有一个由 BottomNavigationView
和一个 fragment
字段组成的 MainActivity 布局,其中包含一个 NavHostFragment
引用相同的导航图。
然后我们都在导航 xml 文件中引用了片段 (StartFragment
),其布局包含一个简单的文本字段。
所有基本上看起来都一样,但在我的情况下,一旦 Activity 到达 StartFragment
,onViewCreated
就会通过它的 setContentView
而在项目中我从中获得灵感Activity 用它的 onCreate
我正在比较 StartFragment.onViewCreated
上转储的两个堆栈跟踪,它们看起来不同,但我不知道是什么原因造成的。
MY STACKTRACE
java.lang.Throwable: stack dump
at java.lang.Thread.dumpStack(Thread.java:490)
at com.mypetproject.StartFragment.onViewCreated(StartFragment.kt:19)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2987)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:546)
at androidx.fragment.app.FragmentStateManager.movetoExpectedState(FragmentStateManager.java:282)
at androidx.fragment.app.FragmentStore.movetoExpectedState(FragmentStore.java:112)
at androidx.fragment.app.FragmentManager.movetoState(FragmentManager.java:1647)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3126)
at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:3063)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2988)
at androidx.fragment.app.FragmentStateManager.ensureInflatedView(FragmentStateManager.java:392)
at androidx.fragment.app.FragmentStateManager.movetoExpectedState(FragmentStateManager.java:281)
at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView(FragmentLayoutInflaterFactory.java:140)
at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:135)
at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:319)
at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:298)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:733)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:696)
at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:170)
at com.mypetproject.MainActivity.onCreate(MainActivity.kt:18)
at android.app.Activity.performCreate(Activity.java:5937)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2251)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
OTHER PROJECT STACKTRACE
java.lang.Throwable: stack dump
at java.lang.Thread.dumpStack(Thread.java:490)
at bg.dihanov.commonui.StartFragment.onViewCreated(StartFragment.kt:19)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:332)
at androidx.fragment.app.FragmentManager.movetoState(FragmentManager.java:1187)
at androidx.fragment.app.FragmentManager.movetoState(FragmentManager.java:1356)
at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
at androidx.fragment.app.FragmentManager.movetoState(FragmentManager.java:1497)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2625)
at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2577)
at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2722)
at androidx.fragment.app.FragmentStateManager.activityCreated(FragmentStateManager.java:346)
at androidx.fragment.app.FragmentManager.movetoState(FragmentManager.java:1188)
at androidx.fragment.app.FragmentManager.movetoState(FragmentManager.java:1356)
at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1434)
at androidx.fragment.app.FragmentManager.movetoState(FragmentManager.java:1497)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2625)
at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2577)
at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:247)
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:541)
at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:210)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1220)
at android.app.Activity.performStart(Activity.java:5953)
at android.app.ActivityThread.performlaunchActivity(ActivityThread.java:2261)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5221)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
附言这两个应用程序都是在运行 Android 21 的模拟器上启动的,并且两个项目的依赖项、插件、gradle 包装器等具有相同的版本。
解决方法
在花费数小时调查此问题后,我发现这是由于我的项目中存在的依赖项在我从中汲取灵感的项目中不存在。
implementation 'androidx.fragment:fragment-ktx:1.3.3'
所以要小心,因为显然这种额外的依赖会修改 Activity/Fragment 对的生命周期/行为