我在项目中使用兼容性包v4,并且在将Fragment
从视图中移除后,保留它时出现了问题。我的Activity
显示了两个片段,一个是左侧的菜单框架,一个是右侧的内容面板。左侧的菜单框架有3个不同的菜单(片段)可以显示。
这是我替换菜单Fragment
的方式:
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”。 我不希望单击后退按钮并看到之前显示的菜单。