我在我的项目中使用了兼容性软件包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(...)
时,我尝试使用Fragment
传递FragmentManager.findFragmentByTag(String tag)
,但它始终是null
,因此我必须每次新Fragment
我希望展示一个不同的菜单。
我的问题是,在将这些Fragment
替换为其他菜单后,如何保留这些Fragment
?我想避免保留对Activity
的手动引用,因为当设备旋转时,我的FragmentManager
类的实例被销毁,我将丢失这些引用。
编辑:为了简化术语,我希望Fragment
能够跟踪以前的{{1}},而不必将它们添加到后台。我不想点击后退按钮,看到上面显示的菜单。
答案 0 :(得分:14)
刚想通了。我添加新的片段而不是删除片段,我只是隐藏它们,然后在我想再次显示它们时显示它们。这是我修改过的方法:
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();
}
答案 1 :(得分:0)
我不确定这是否可行。 FragmentManager
只关注他的BackStack上的Fragments
。但是,如果您让FragmentActivity
实施onBackButtonPressed
并让自定义行为发生,则可以解决按下后退按钮的问题。您可以将它们委托给Fragments
,或者只显示另一个Fragment
,具体取决于您的应用逻辑