切换片段而不丢失状态的常用方法

时间:2017-04-26 07:24:23

标签: android fragment

我对Android开发很新,所以我很好奇如何正常使用Fragments。

我的应用程序包含一个BottomNavigationActivity,它使用以下代码在3个片段之间切换:

FragmentManager fragmentManager = getSupportFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.content_montage_order_detail, fragment).commit();

我将片段存储在List<Fragment>中以避免丢失当前状态。但每当我用另一个替换片段时,调用方法onDestroy()

我知道,我知道我可以在fragmentmanager中添加和删除片段而不是替换它。我用Google搜索了大部分教程告诉我替换片段。

保持片段状态的常用方法是什么,而不是在每次调用时都重新创建片段?

5 个答案:

答案 0 :(得分:2)

找到解决方案

它不会随时重新创建片段

FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().add(R.id.content_montage_order_detail, fragment).commit();

答案 1 :(得分:2)

在创建片段时使用片段TAG,然后当您想再次使用它时使用findFragmentByTag。如果片段已经创建,则片段管理器将找到旧片段。

片段previousFragment = fragmentManager.findFragmentByTag(“TAG”);

答案 2 :(得分:2)

我建议您使用show,而不是replace

protected void addFragmentStack(Fragment fragment) {
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    if (this.mContent != fragment) {
        if (fragment.isAdded()) {
            ft.hide(this.mContent).show(fragment);
        } else {
            ft.hide(this.mContent).add(getFragmentViewId(), fragment);
        }
        this.mContent = fragment;
    }
    ft.commit();
}

答案 3 :(得分:1)

Ya,您还可以通过管理 backstack 来管理州。

答案 4 :(得分:1)

尝试使用switchFragment切换片段,如果已添加片段,则会显示片段。

使用fragmentTransaction.show方法重新使用现有片段,即保存的实例。

public void switchFragment (Fragment oldFragment, Fragment newFragment, int frameId) {

    boolean addFragment = true;

    FragmentManager fragmentManager = getFragmentManager ();
    String tag = newFragment.getArguments ().getString (BaseFragment.TAG);
    Fragment fragment = fragmentManager.findFragmentByTag (tag);

    // Check if fragment is already added
    if (fragment != null && fragment.isAdded ()) {
        addFragment = false;
    }

    // Hide previous fragment
    String oldFragmentTag = oldFragment.getArguments ().getString (BaseFragment.TAG);

    if (!tag.equals (oldFragmentTag)) {
        FragmentTransaction hideTransaction = fragmentManager.beginTransaction ();
        Fragment fragment1 = fragmentManager.findFragmentByTag (oldFragmentTag);
        hideTransaction.hide (fragment1);
        hideTransaction.commit ();
    }

    // Add new fragment and show it
    FragmentTransaction addTransaction = fragmentManager.beginTransaction ();

    if (addFragment) {
        addTransaction.add (frameId, newFragment, tag);
        addTransaction.addToBackStack (tag);
    }
    else {
        newFragment = fragmentManager.findFragmentByTag (tag);
    }

    addTransaction.show (newFragment);

    addTransaction.commit ();
}