管理片段事务,您不希望丢失某些片段的数据

Abd*_*eem 5 android android-fragments

我有5个片段,其中两个是列表片段,包含一些数据(昂贵的加载),其余的没有任何重要的.

我的目标是如何管理事务,以便只有一个List片段保留在内存中(始终),当我按下它时,它应该恢复到列表片段.这是一些部分代码,用于处理片段的on,但问题是当我按下它时不会卸载当前片段而是加载Main Fragment而不删除当前片段.

WorkFlow:主片段(任务片段)在开始后加载任何片段都可以加载.如果主要片段是当前的并且选择了组片段,则删除主片段,否则如果选择任何其他片段则保留(隐藏)主片段并加载新片段

注意:它与导航抽屉一起使用,其中1个片段在开始时加载

public class FragmentController {

    private static final String TAG_MAIN = "main"; //Expensive
    private static final String TAG_GROUP = "group"; //Expensive
    private static final String TAG_PROFILE = "profile"; //Cheap
    private static final String TAG_CREATE_TASK = "create_task"; //Cheap
    private static final String TAG_CREATE_GROUP = "create_group";//Cheap
    private static final String TAG_SETTINGS = "settings"; //Cheap

    private android.support.v4.app.FragmentManager fragmentManager;


    @IdRes private int container;

    public FragmentController(android.support.v4.app.FragmentManager fragmentManager, @IdRes int container) {
        this.fragmentManager = fragmentManager;
        this.container = container;
    }

    public void showMainFragment() {
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        if (containsMainFragment()) {
            if (!isMainCurrent()) {
                transaction
                        .show(getMainFragment())
                        .commit();
            }
        } else {
            transaction
                    .replace(container, getMainFragment(), TAG_MAIN)
                    .commit();
        }
    }

    public void showGroupFragment() {
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        if (containsGroupFragment()) {
            if (!isGroupCurrent()) {
                transaction
                        .show(getGroupFragment())
                        .commit();
            }
        } else {
            transaction
                    .replace(container, getGroupFragment(), TAG_GROUP)
                    .commit();
        }
    }

    public void showProfileFragment() {
        showLightFragment(ProfileFragment.newInstance(), TAG_PROFILE);
    }

    public void showCreateTaskFragment() {
        showLightFragment(CreateTaskFragment.newInstance(), TAG_CREATE_TASK);
    }

    public void showCreateGroupFragment() {
        showLightFragment(CreateGroupFragment.newInstance(), TAG_CREATE_GROUP);
    }

    public void showSettingsFragment() {
        showLightFragment(SettingsFragment.newInstance(), TAG_SETTINGS);
    }

    private void showLightFragment(Fragment fragmentInstance, String tag) {
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        Fragment fragment = getCurrentFragment();
        if (containsListFragment() && (isMainCurrent() || isGroupCurrent())) {
            assert fragment != null;
            transaction = transaction
                            .hide(fragment)
                            .add(container, fragmentInstance, tag)
                            .addToBackStack(tag);
        } else {
            transaction = transaction
                            .remove(fragment)
                            .add(container, fragmentInstance, tag);
        }
        if(isCreateTaskFragment(fragment)){

            transaction = transaction
                    .addToBackStack(tag);
        }
        transaction.commit();
    }

    private boolean containsListFragment() {
        return getFragmentByTag(TAG_MAIN) != null || getFragmentByTag(TAG_GROUP) != null;
    }

    private boolean containsMainFragment() {
        return getFragmentByTag(TAG_MAIN) != null;
    }

    private boolean containsGroupFragment() {
        return getFragmentByTag(TAG_GROUP) != null;
    }

    private Fragment getMainFragment() {
        Fragment fragment = getFragmentByTag(TAG_MAIN);
        if (fragment == null) {
            fragment = TasksFragment.newInstance();
        }
        return fragment;
    }

    private Fragment getGroupFragment() {
        Fragment fragment = getFragmentByTag(TAG_GROUP);
        if (fragment == null) {
            fragment = GroupTasksFragment.newInstance();
        }
        return fragment;
    }

    private Fragment getFragmentByTag(String tag) {
        return fragmentManager.findFragmentByTag(tag);
    }

    private Fragment getCurrentFragment() {
        return fragmentManager.findFragmentById(container);
    }

    private boolean isMainCurrent() { return isCurrent(TAG_MAIN); }

    private boolean isGroupCurrent() {
        return isCurrent(TAG_GROUP);
    }

    private boolean isCurrent(String tag) {
        Fragment fragment = getCurrentFragment();
        return fragment != null && fragment.getTag() != null && fragment.getTag().equals(tag);
    }

    private boolean isCreateTaskFragment(Fragment fragment){
        return fragment!=null && fragment.getTag()!=null && fragment.getTag().equals(TAG_CREATE_TASK);
    }

}
Run Code Online (Sandbox Code Playgroud)

Abd*_*eem 0

好吧,问题仍然存在,但我最终用一个活动替换了 CreateTaskFragment(这是问题所在)。