如何删除隐藏的片段

时间:2014-10-09 14:08:33

标签: android fragment

我正在尝试将布局从完整视图切换到双窗格视图,如下所示:

.......     .......
.     .     .     .
.     . --> .......
.     .     .     .
.......     ....... 

现在的问题是我将从带有片段的1个容器转到2个容器,每个容器中都有一个片段。为了做到这一点,我正在删除旧片段并添加新片段。但是当我删除大片段时,会出现一个OLD片段。我在旧片段上设置了标记,然后用getFragmentManager().findFragmentByTag()搜索它,但它只返回null。

现在我的hack是使用largeView.setVisibility(View.gone);有没有更好的方法来解决这个问题?

修改

似乎这个bug不再被复制了。这意味着替换应该做它应该做的一直。但是为什么会出现故障?日食?的Android?

EDIT2

这就是我替换片段的方式:

Fragment fragment = new SimpleScannerFragment();

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.main_container, fragment, SCAN_FRAGMENT_TAG);
ft.commit();

在切换到双窗格布局之前,我会像这样弹出堆栈:

getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 

我使用这个删除片段:

removeFragment = getFragmentManager().findFragmentByTag(SCAN_FRAGMENT_TAG);
if(removeFragment != null) {
    getFragmentManager().beginTransaction().remove(removeFragment).commit();
}

当我从单一窗格转到双窗格时,我正在切换视图可见性:

    // hide main layout as well, THIS IS MY HACKS just in case it does this again...
    FrameLayout frame = (FrameLayout) this.findViewById(R.id.main_container);
    frame.setVisibility(View.GONE);

    // add new layout
    FragmentTransaction ft = getFragmentManager().beginTransaction();

    CustomMapFragment fragment = CustomMapFragment.newInstance();
    ScoreFragment scoreFragment = new ScoreFragment();

    ft.replace(R.id.main_narrow_bot_container, fragment);
    ft.replace(R.id.main_narrow_top_container, scoreFragment);
    ft.commit();

4 个答案:

答案 0 :(得分:1)

如何尝试清除整个后台?

private void clearBackStack(){
        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        fragmentManager.popBackStackImmediate();
    }

答案 1 :(得分:0)

你只需要获得FragmentManager的实例。

然后使用这条神奇的线条。

 fm.replace(R.id.fragment_main, frag).commit();

答案 2 :(得分:0)

替换方法被窃听(至少是API19)。最好使用添加删除的组合。 但我不确定它是否已在API21中修复。

答案 3 :(得分:0)

使用此方法,您可以删除与FragmentManager关联的所有片段的backStack:

FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {    
    fm.popBackStack();
}

如果要删除与childFragmentManager或SupportFragmentManager关联的所有片段,则类似。

希望它可以帮到你!!