繁体   English   中英

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

[英]How to load again a Fragment in FrameLayout?

可以说我有类别A和类别B。我根据类别将数据加载到RecyclerView中。 然后是一个过滤器,它实际上过滤内容。 这是打开/关闭过滤器时的操作:

@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时,我正在重新加载承载Filters片段的父片段。 因此,在更改类别时,我检查了包含RecyclerView片段是否在后堆栈中,然后将popBackStack to that fragment, and update the data from如下to that fragment, and update the data from RecyclerView` to that fragment, and update the data from

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();
        }

这也优化了内存使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM