不维护Back Stack - 如何防止碎片被破坏?

时间:2017-12-25 14:01:32

标签: android android-fragments fragment

我有两项活动,均延伸至AppCompatActivity,如下所示

MainActivity - 托管通过FragmentPagerAdapter

附加的3个片段

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

问题:在MainActivity加载了所有3个片段后,用户从MainActivity的optionMenu开启关于活动。在AboutActivity中,用户单击工具栏后退按钮,然后再次返回到MainActivity。

问题是,MainActivity中的所有片段都与Activity本身一起被破坏,并且它们被重新创建。

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

我在stackoverflow上找到了similar question,但没有找到它相关,因为我正在使用FragmentPagerAdapter,而这个问题是基于片段事务

日志 - App Started和MainActivity加载了3个片段,List片段显示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

用户从选项菜单中选择关于,并且AboutActivity已启动,此活动不使用任何片段。根据下面的日志,应用程序行为似乎没问题。

    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本身被破坏,片段和活动都被重新创建。 不确定它导致什么破坏并重新创建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

2 个答案:

答案 0 :(得分:1)

最终找到解决方案

从AndroidManifest行android:parentActivityName=".MainActivity"

中删除<activity android:name=".AboutActivity" android:label="About" android:configChanges="orientation|screenSize" />

和处理工具栏背面按下面。

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

return super.onOptionsItemSelected(item);
}

答案 1 :(得分:0)

由于您尚未共享代码。我认为可能有3种导航方案: 的 1.A(startActivity())---&GT; B(startActivity())---&gt;一种
2.A(startActivity()+光洁度()) - &GT; B(startActivity()) - &gt;一种
 3.A(startActivity())---&gt; B(finish()或onBackPressed())---&gt; A
第一种情况和第二种情况 < / strong>,创建了活动A的新实例,因此显然会破坏并重新创建片段。 在第三种情况下 ,活动A的实例不会被销毁,因为它保存在堆栈中。当B被破坏时,活动A刚刚从堆栈中跳出来。在这种情况下,活动不会被破坏,因此片段也不会被破坏。 因此,这取决于您如何导航到A-&gt; B-&gt; A.如果您想要防止碎片被破坏,您必须切换到活动A,它不会被破坏或者在后台堆栈上可用。