如何恢复以前显示的片段?

我在我的项目中使用了兼容性软件包v4,并且在从视图中移除Fragment后遇到问题。 我有我的Activity显示2个片段…左侧的菜单框架,右侧的内容窗格。 菜单框架有3个不同的菜单(碎片)可以显示。

这是我如何更换菜单片段:

 public void showMenuFragment( Fragment fragment, String tag ) { showFragment( R.id.menu_frame, fragment, tag, false); setLastMenuPushed( tag ); } protected void showFragment( int resId, Fragment fragment, String tag, boolean addToBackStack ) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); if ( fragmentManager.findFragmentByTag( tag ) != null && fragment.isAdded() ) { transaction.remove( fragment ); } transaction.replace( resId, fragment, tag ).setTransition( FragmentTransaction.TRANSIT_FRAGMENT_OPEN ).setBreadCrumbShortTitle( tag ); if ( addToBackStack ) { transaction.addToBackStack( tag ); } transaction.commit(); } 

菜单Fragment要求数据在被显示之前被加载,所以我显示一个加载微调器。 一旦第一次加载,除非Activity完成,否则我不想再次加载它。

当我调用showMenuFragment(...)我尝试使用FragmentManager.findFragmentByTag(String tag)传递Fragment但它总是null ,所以我必须做一个新的Fragment每次我想显示不同的菜单。

我的问题是,在被其他菜单取代之后,我怎样才能保留这些Fragment ? 我想避免保持对Fragment的手动引用,因为当设备被旋转时,我的Activity类的实例被销毁,我将失去这些引用。

编辑:放在更简单的条款,我希望FragmentManager跟踪以前的Fragment s,而不必将它们添加到后面的堆栈。 我不想点击后退button,看到前面的菜单显示。

Solutions Collecting From Web of "如何恢复以前显示的片段?"

只是想通了。 当我添加新的碎片时,我不会删除碎片,而是将它们隐藏起来,然后再显示它们,以便再次显示它们。 这是我修改的方法:

 public void showMenuFragment( Fragment fragment, String tag, boolean addToBackStack ) { showFragment( R.id.menu_frame, fragment, tag, getLastMenuPushed(), addToBackStack ); setLastMenuPushed( tag ); } protected void showFragment( int resId, Fragment fragment, String tag, String lastTag, boolean addToBackStack ) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); if ( lastTag != null ) { Fragment lastFragment = fragmentManager.findFragmentByTag( lastTag ); if ( lastFragment != null ) { transaction.hide( lastFragment ); } } if ( fragment.isAdded() ) { transaction.show( fragment ); } else { transaction.add( resId, fragment, tag ).setBreadCrumbShortTitle( tag ); } if ( addToBackStack ) { transaction.addToBackStack( tag ); } transaction.commit(); } 

我不确定这是否可能。 FragmentManager只关注他的BackStack上的Fragments 。 但是,如果让FragmentActivity实现onBackButtonPressed并让自定义行为发生,则可以解决后退button问题。 你可以把它们委托给你的Fragments ,或者根据你的应用逻辑显示另一个Fragment