我知道有很多关于碎片的问题,我读了许多,但似乎我还没有把握它。
我的应用有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()
。
答案 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)
。
添加(片段片段,字符串标记)
调用add(int,Fragment,String) 使用0 containerViewId。
老实说,我无法理解为什么或什么时候添加碎片无处可去。如果有人知道它的用法,请发表评论或编辑此答案。
第二个问题:正如我所提到的,我有一个总是添加到Activity的地图,我一直隐藏/显示它以保持其状态。使用replace()
的问题是,再次来自documentation:
replace(int containerViewId,Fragment fragment,String tag)
替换添加到容器中的现有片段。
然而,当我查看我理解的完整描述时:
替换添加到容器的现有片段。这是 与当前所有人的调用删除(Fragment)基本相同 添加了相同的containerViewId然后添加的片段 add(int,Fragment,String)与此处给出的参数相同。
这意味着我的地图也被移除了。
经验教训:
.replace(new)
与.remove(current).add(new)
不完全相同。