在平板电脑上,我们有两个彼此相邻的片段(相同数据的两个不同视图)。在移动设备上,我们只需按一下按钮即可在这两个片段之间切换。移动布局看起来像这样:
<RelativeLayout>
<fragment id="container" name="fragA"/>
<ImageButton onClick="swapFragments" />
</RelativeLayout>
在活动的swapFragments(View)
方法中,我尝试使用FragmentManager
将fragA
替换为fragB
:
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container, new FragB());
fragmentTransaction.commit();
...但我始终可以通过fragA
的透明部分看到fragB
,让我相信它只是将fragB
放在fragA
之上,而不是替换它。
我开始在事务中使用hide(Fragment)
和类似的方法,但这看起来不是正确的方法。
有关如何正确交换这些碎片的任何提示吗?
修改:我看到了this question的答案。这让我感到困惑,因为我需要能够为平板电脑和手机指定不同的布局。如果我必须以编程方式添加片段,我如何避免特定于活动中每个布局的代码(即
if(TABLET) {
addFragmentA();
addFragmentB();
} else {
addFragmentA();
}
答案 0 :(得分:3)
不要混合使用XML和代码创建的碎片 - 会发生不好的事情。在布局中保留容器视图,然后在其中添加/替换片段(其中没有第一个片段)。
答案 1 :(得分:0)
对我来说很好看,我正在做类似的事情,虽然我正在使用add
从活动中添加我的初始片段,而不是通过在布局中引用它来加载它。那里可能有一个bug。仅供参考我正在使用兼容性库。
可能值得尝试:
1)将事务添加到后台堆栈以查看是否会产生影响,看起来您可能仍然需要该功能。
2)在布局中为您的片段添加ID或标记,然后使用它来代替执行remove
和add
fragB。
3)尝试从代码中加载你的fragA,看看是否有所作为。
答案 2 :(得分:0)
好吧,首先你可以尝试使用newInstance()工厂方法来实例化片段B,而不仅仅是新的FragB()。 但是,我认为这不是问题。
你能尝试不在你的XML布局中使用片段标签吗? 做这样的事情:
<RelativeLayout>
<Linear/FrameLayout id="container" name="fragA"/>
<ImageButton onClick="swapFragments" />
</RelativeLayout>
因此,使用Frame或LinearLayout作为容器进行分段,并在Fragment的onCreateView回调中对其进行充气。也许它会有所帮助,请告诉我。
干杯!
答案 3 :(得分:0)
据我所知,你没有隐藏/分离前一个片段,所以两者都会显示出来。你可以实现这样的东西:
if (mFragment != null) {
ft = mActivity.getSupportFragmentManager().beginTransaction();
ft.hide(mFragment);
ft.detach(mFragment);
ft.commitAllowingStateLoss();
}