后退堆栈未维护 - 如何防止片段被破坏?



>我有 2 个活动,都从AppCompatActivity扩展如下

主活动- 托管通过FragmentPagerAdapter附加的 3 个片段

关于活动- 独立的活动,不使用片段

问题:在主活动加载所有 3 个片段后,用户从主活动的 optionMenu.In 关于活动打开关于活动,用户单击工具栏后退按钮,然后再次返回主活动。

这就是问题所在,MainActivity 中的所有片段都与 Activity 本身一起销毁,并重新创建它们。

我已经捕获了上述 3 个步骤的日志,并复制在下面。

我在stackoverflow上发现了类似的问题,但发现它不相关,因为我使用的是FragmentPagerAdapter,并且该问题基于片段事务

日志- 应用程序启动和主活动加载了 3 个片段,列表片段显示 3 次,因为 3 个片段被 ListFragment 继承。如下,日志应用程序行为似乎很好。

I/System.out: MainActivity.onAttachFragment ReportFragment{2a7b515 #0 android.arch.lifecycle.LifecycleDispatcher.report_fragment_tag}
I/System.out: MainActivity.onCreate
I/System.out: MainFragmentPageAdapter.MainFragmentPageAdapter
I/System.out: MainActivity.onStart
I/System.out: MainActivity.onResume
I/System.out: MainActivity.onResumeFragments
I/System.out: MainFragmentPageAdapter.getItem
I/System.out: MainFragmentPageAdapter.getItem
I/System.out: MainFragmentPageAdapter.getItem
I/System.out: ListFragment.onAttach context = com.global.MainActivity@99b50ff, activity = com.global.MainActivity@99b50ff
I/System.out: MainActivity.onAttachFragment ListFragment{894a792 #0 id=0x7f0901a3 android:switcher:2131296675:0}
I/System.out: ListFragment.onCreate
I/System.out: ListFragment.onAttach context = com.global.MainActivity@99b50ff, activity = com.global.MainActivity@99b50ff
I/System.out: MainActivity.onAttachFragment ListFragment{720b78c #1 id=0x7f0901a3 android:switcher:2131296675:1}
I/System.out: ListFragment.onCreate
I/System.out: ListFragment.onAttach context = com.global.MainActivity@99b50ff, activity = com.global.MainActivity@99b50ff
I/System.out: MainActivity.onAttachFragment ListFragment{fe7c078 #2 id=0x7f0901a3 android:switcher:2131296675:2}
I/System.out: ListFragment.onCreate
I/System.out: ListFragment.onCreateView
I/System.out: ListFragment.onViewStateRestored
I/System.out: ListFragment.onStart
I/System.out: ListFragment.onResume
I/System.out: ListFragment.onCreateView
I/System.out: ListFragment.onViewStateRestored
I/System.out: ListFragment.onCreateView
I/System.out: ListFragment.onViewStateRestored
I/System.out: ListFragment.onStart
I/System.out: ListFragment.onResume
I/System.out: ListFragment.onStart
I/System.out: ListFragment.onResume

用户从选项菜单中选择"关于","关于活动"已启动,则此活动不使用任何片段。根据下面的日志,应用程序行为似乎很好。

I/System.out: ListFragment.onPause
I/System.out: ListFragment.onPause
I/System.out: ListFragment.onPause
I/System.out: MainActivity.onPause
I/System.out: AboutActivity.onAttachFragment ReportFragment{9b431e0 #0 android.arch.lifecycle.LifecycleDispatcher.report_fragment_tag}
I/System.out: AboutActivity.onCreate
I/System.out: AboutActivity.onStart
I/System.out: AboutActivity.onResume
I/System.out: AboutActivity.onResumeFragments
I/System.out: AboutActivity.onAttachedToWindow
I/System.out: ListFragment.onSaveInstanceState
I/System.out: ListFragment.onSaveInstanceState
I/System.out: ListFragment.onSaveInstanceState
I/System.out: ListFragment.onStop
I/System.out: ListFragment.onStop
I/System.out: ListFragment.onStop
I/System.out: MainActivity.onStop

用户单击后退按钮,应该再次返回主活动。它确实发生了,但在此之前,MainActivity 上的所有片段都被销毁,MainActivity 本身被销毁,并且片段和活动都被重新创建。 不确定它导致破坏和重新创建 MainActivity 及其下的 3 个片段的原因。(这是我正在寻找解决方案的问题)

I/System.out: AboutActivity.onPause
I/System.out: ListFragment.onDestroy
I/System.out: ListFragment.onDetach
I/System.out: ListFragment.onDestroy
I/System.out: ListFragment.onDetach
I/System.out: ListFragment.onDestroy
I/System.out: ListFragment.onDetach
I/System.out: MainActivity.onDestroy
I/System.out: MainActivity.onAttachFragment ReportFragment{a36b9c6 #0 android.arch.lifecycle.LifecycleDispatcher.report_fragment_tag}
I/System.out: MainActivity.onCreate
I/System.out: MainFragmentPageAdapter.MainFragmentPageAdapter
I/System.out: MainActivity.onStart
I/System.out: MainActivity.onResume
I/System.out: MainActivity.onResumeFragments
I/System.out: MainFragmentPageAdapter.getItem
I/System.out: MainFragmentPageAdapter.getItem
I/System.out: MainFragmentPageAdapter.getItem
I/System.out: ListFragment.onAttach context = com.global.MainActivity@4adb3a1, activity = com.global.MainActivity@4adb3a1
I/System.out: MainActivity.onAttachFragment ListFragment{7a21b5a #0 id=0x7f0901a3 android:switcher:2131296675:0}
I/System.out: ListFragment.onCreate
I/System.out: ListFragment.onAttach context = com.global.MainActivity@4adb3a1, activity = com.global.MainActivity@4adb3a1
I/System.out: MainActivity.onAttachFragment ListFragment{5f7418b #1 id=0x7f0901a3 android:switcher:2131296675:1}
I/System.out: ListFragment.onCreate
I/System.out: ListFragment.onAttach context = com.global.MainActivity@4adb3a1, activity = com.global.MainActivity@4adb3a1
I/System.out: MainActivity.onAttachFragment ListFragment{cc17268 #2 id=0x7f0901a3 android:switcher:2131296675:2}
I/System.out: ListFragment.onCreate
I/System.out: ListFragment.onCreateView
I/System.out: ListFragment.onViewStateRestored
I/System.out: ListFragment.onStart
I/System.out: ListFragment.onResume
I/System.out: ListFragment.onCreateView
I/System.out: ListFragment.onViewStateRestored
I/System.out: ListFragment.onCreateView
I/System.out: ListFragment.onViewStateRestored
I/System.out: ListFragment.onStart
I/System.out: ListFragment.onResume
I/System.out: ListFragment.onStart
I/System.out: ListFragment.onResume
I/System.out: AboutActivity.onStop
I/System.out: AboutActivity.onDestroy
I/System.out: AboutActivity.onDetachedFromWindow

最终找到了解决方案

从 AndroidManifest 第<activity android:name=".AboutActivity" android:label="About" android:configChanges="orientation|screenSize" />行中删除了android:parentActivityName=".MainActivity"

并按如下方式处理工具栏后按。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home)
{
onBackPressed();
return  true ;
}
return super.onOptionsItemSelected(item);
}

最新更新