如何在 FrameLayout 中再次加载一个 Fragment?

How to load again a Fragment in FrameLayout?

假设我有类别 A 和 B。我根据类别在 RecyclerView 中加载数据。然后是过滤器,它实际上是过滤内容。 这是我在过滤器为 opened/closed:

时所做的
@Override
        public void onShowSheet() {
            Fragment f = getActivity().getSupportFragmentManager().findFragmentById(R.id.filterContent);
            if (!(f instanceof FilterFragment)) {
                FilterFragment filterFragment = FilterFragment.newInstance();
                FragmentManager fm = getActivity().getSupportFragmentManager();
                FragmentTransaction fragmentTransaction = fm.beginTransaction();
                fragmentTransaction.replace(R.id.filterContent, filterFragment, "FilterFragment");
                fragmentTransaction.commit();
            }
        }

        @Override
        public void onHideSheet() {
            Fragment f = getActivity().getSupportFragmentManager().findFragmentById(R.id.filterContent);
            getActivity().getSupportFragmentManager().beginTransaction().
                    remove(getActivity().getSupportFragmentManager().findFragmentById(R.id.filterContent)).commit();
            FragmentManager manager = getActivity().getSupportFragmentManager();
            FragmentTransaction trans = manager.beginTransaction();
            trans.remove(f);
            trans.commit();
        }
    });

重新打开过滤器时,它会重新加载过滤器片段及其数据。

当我更改类别并打开过滤器时,它显示空白。

如何加载或终止片段,使其不显示空白?


更新

更改类别后,过滤器为空,我按返回键返回预览类别,并显示过滤器,但如果我尝试应用过滤器,应用程序会崩溃。

当我更改类别时,我重新加载包含数据的片段:

public static void inflateGridFragment() {
    GridFragment fragment = new GridFragment();
    FragmentManager fm = context.getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fm.beginTransaction();
    fragmentTransaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right,
            R.anim.slide_out_left, R.anim.slide_out_left);
    fragmentTransaction.add(R.id.mdContent, fragment, Strings.TAG_GRID_FRAMGMENT);
    fragmentTransaction.addToBackStack(Strings.TAG_GRID_FRAMGMENT);
    fragmentTransaction.commit();
}

问题是,当从类别 A 更改为类别 B 时,我正在重新加载承载过滤器片段的父片段。因此,当更改类别时,我检查包含 RecyclerView 的片段是否在 backstack 中,然后我执行 popBackStackto that fragment, and update the data fromRecyclerView` 如下:

boolean foundGridFragment = false;
        String fragmentBackstackTag = "";
        FragmentManager fm = context.getSupportFragmentManager();
        for(int entry = 0; entry < fm.getBackStackEntryCount(); entry++){
            fragmentBackstackTag = fm.getBackStackEntryAt(entry).getName();
            Log.i(TAG, "Found fragment: " + fragmentBackstackTag);

            // check if null, because sometimes fragmentBackstacktag may null
            if (fragmentBackstackTag != null) {
                if (fragmentBackstackTag.equals(Strings.TAG_GRID_FRAMGMENT)) {
                    foundGridFragment = true;
                    fm.popBackStack(Strings.TAG_GRID_FRAMGMENT, 0);
                }
            }
        }
        if (!foundGridFragment) {
            inflateGridFragment();
        }

这也优化了内存使用。