Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何删除隐藏的片段_Android_Fragment - Fatal编程技术网

Android 如何删除隐藏的片段

Android 如何删除隐藏的片段,android,fragment,Android,Fragment,我正在尝试将布局从全视图切换到双窗格视图,如下所示: ....... ....... . . . . . . --> ....... . . . . ....... ....... 现在的问题是,我将从一个包含片段的容器变成两个包含片段的容器。为了做到这一点,我将删除旧片段并添加新片段。但是当我移除大片段中的片段时,会出现一个旧片段。我已经在旧片段上设置了标记,并使用getFragmentManager().fin

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

.......     .......
.     .     .     .
.     . --> .......
.     .     .     .
.......     ....... 
现在的问题是,我将从一个包含片段的容器变成两个包含片段的容器。为了做到这一点,我将删除旧片段并添加新片段。但是当我移除大片段中的片段时,会出现一个旧片段。我已经在旧片段上设置了标记,并使用
getFragmentManager().findFragmentByTag()
搜索它,但它只返回null

现在我的技巧是使用largeView.setVisibility(View.gone);有没有更好的方法来处理这个问题

编辑

看起来这个bug不再被复制了。这意味着replace一直在做它应该做的事情。但是为什么它会出故障呢?日食?安卓

Edit2

以下是我替换片段的方式:

Fragment Fragment=新的SimpleScannerFragment()

切换到双窗格布局之前,我会按如下方式弹出堆栈:

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

您只需要获取FragmentManager的实例

然后用这条神奇的线

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

尝试清除整个后台堆栈怎么样

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

replace方法存在错误(至少是API19中的错误)。最好使用添加删除的组合。
但我不确定它在API21中是否已修复。

通过此操作,您可以删除与FragmentManager关联的所有backbackback片段:

FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {    
    fm.popBackStack();
}
FragmentManager fm=getActivity().getSupportFragmentManager();
对于(int i=0;i
如果要删除与childFragmentManager或SupportFragmentManager关联的所有片段,则类似


希望它能帮助你

如果只是保留一个已创建片段的实例,然后使用创建时所保留的实例将其删除,但在切换片段时,我将替换片段。我应该能够找到他们的标签,如果他们存在无论如何。我会试一试,但似乎仍然不对。您是否尝试使用findFragmentById?请将您的代码发布在此处“旧片段”是什么意思?首先,您将片段从“旧”更改为“新”的方式可能有些问题(在您尝试将新片段更改为其他两个片段之前),因此请发布所有片段更改的代码及其出现的位置。这就是我正在做的:)我的观点是,这不起作用。看看这个。这将帮助您定义实际使用的替换和清除后堆栈。所以它仍然出现是没有意义的,而且我不能再复制了,所以可能只是一个小故障…这很奇怪…但我很高兴你能够克服这个问题:)
FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {    
    fm.popBackStack();
}