我的碎片发生了什么?

时间:2015-07-08 22:08:52

标签: android android-fragments

我知道有很多关于碎片的问题,我读了许多,但似乎我还没有把握它。

我的应用有9个碎片。在其中一个,比如Fragment X,我正在播放媒体,并且从那里它在屏幕上显示另一个片段,比如Y.为了表现,我认为最好的是使用replace()

我的相关代码:

// Button clicked, goes from X to Y
getFragmentManager().beginTransaction()
                .replace(R.id.container, fragmentY)
                .commit();

调用onBackPressed()时,fragmentY是fragmentManager.findFragmentById(R.id.container)返回的那个:

fragmentManager.beginTransaction()
                    .replace(R.id.container, fragmentX)
                    .commit();

预期行为:删除X并添加Y.返回时,删除Y并添加X.

发生了什么:我第一次去Y,Y按预期显示,但是当我听到音频播放时,X仍在运行。当我回去时,Y消失了,看起来很好。但是,下次我点击进入Y时,X会被销毁(音频停止播放),应用程序变得奇怪,因为我的ActionBar出现了,它不应该出现。此外,我保留了一个隐藏的片段,其中的地图在执行后会变为空白。

我想,replace()不仅会删除当前片段,还会删除所有可见片段。但是.remove(X).add(Y," y")没有显示我的碎片。

任何帮助?

编辑:正如有人问的那样,我的Fragment X可以从应用程序的不同点添加到Activity中,因此有不同的方式。他们是两个人:

// If backPressed and current Fragment is A
fragmentTransaction.remove(fragmentA).add(R.id.container, objectFragment).commit();

// If backPressed and current Fragment is B (map)
fragmentTransaction.hide(fragmentB).add(R.id.container, objectFragment).commit();

大多数时候我必须知道我来自哪里以及我要去哪里,这就是为什么我没有使用addToBackStack()

2 个答案:

答案 0 :(得分:0)

我会尝试使用

管理将片段添加到后台堆栈

addToBackStack(String name)方法。

这里有一个非常有用的答案:Difference between add(), replace(), and addToBackStack()

答案 1 :(得分:0)

我担心我没有提供足够的信息来发现主要错误,但无论如何我会发布我如何解决它和我的结论。

主要错误:replace()显示Y并删除()。add()不是因为我在做.add(fragmentY, tag),它应该是.add(R.id.container, fragmentY, tag)

来自documentation

  

添加(片段片段,字符串标记)

     

调用add(int,Fragment,String)   使用0 containerViewId。

老实说,我无法理解为什么或什么时候添加碎片无处可去。如果有人知道它的用法,请发表评论或编辑此答案。

第二个问题:正如我所提到的,我有一个总是添加到Activity的地图,我一直隐藏/显示它以保持其状态。使用replace()的问题是,再次来自documentation

  

replace(int containerViewId,Fragment fragment,String tag)

     

替换添加到容器中的现有片段。

然而,当我查看我理解的完整描述时:

  

替换添加到容器的现有片段。这是   与当前所有人的调用删除(Fragment)基本相同   添加了相同的containerViewId然后添加的片段   add(int,Fragment,String)与此处给出的参数相同。

这意味着我的地图也被移除了。

经验教训:

  • 有一个方法add(),它不接收容器ID,应该避免使用
  • .replace(new).remove(current).add(new)不完全相同。