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

Jas*_*son 10 android android-fragments

我在我的项目中使用了兼容性软件包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();
    }
Run Code Online (Sandbox Code Playgroud)

菜单Fragment需要在显示之前加载数据,因此我显示了加载微调器.一旦它第一次装载,我希望不必再次加载它,除非Activity完成.

当我打电话showMenuFragment(...)我尝试在通过Fragment使用FragmentManager.findFragmentByTag(String tag),但它总是null,所以我有一个新的,使Fragment我想显示不同的菜单每一次.

我的问题是,如何Fragment在被其他菜单替换之后保留这些内容?我想避免保持对Fragments的手动引用,因为当设备旋转时,我的Activity类的实例被销毁,我将丢失这些引用.

编辑:为了简化术语,我希望FragmentManager能够跟踪以前的Fragments,而不必将它们添加到后台.我不想点击后退按钮,看到上面显示的菜单.

Jas*_*son 15

刚想通了.我添加新的片段而不是删除片段,我只是隐藏它们,然后在我想再次显示它们时显示它们.这是我修改过的方法:

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();
}
Run Code Online (Sandbox Code Playgroud)

  • 回想一下,我认为更好的解决方案是将片段与活动"分离"并在课堂上对其进行严格的引用. (3认同)
  • 实际上,它似乎是"detach()旧的 - add()新的"与replace()做同样的事情,即用空实例状态Bundle重新启动Fragment的生命周期,这样做无济于事. (2认同)