在单个活动中交换片段?

mag*_*ter 6 layout android android-fragments

在平板电脑上,我们有两个彼此相邻的片段(相同数据的两个不同视图).在移动设备上,我们只需按一下按钮即可在这两个片段之间切换.移动布局看起来像这样:

<RelativeLayout>
  <fragment id="container" name="fragA"/>
  <ImageButton onClick="swapFragments" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

在activity的swapFragments(View)方法中,我试图使用FragmentManager替换fragAfragB:

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.container, new FragB());
fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

...但我总能看到fragA通过的透明部分fragB,导致我相信,它只是把fragB之上fragA,而不是取代它.

我开始hide(Fragment)在事务中使用和类似方法的路径,但这看起来不是正确的方法.

有关如何以正确方式交换这些碎片的任何提示?

编辑:我看到了这个问题的答案.这让我感到困惑,因为我需要能够为平板电脑和手机指定不同的布局.如果我必须以编程方式添加片段,如何避免特定于活动中每个布局的代码(即

 if(TABLET) {
   addFragmentA();
   addFragmentB();
 } else {
   addFragmentA();
 }
Run Code Online (Sandbox Code Playgroud)

PJL*_*PJL 0

对我来说看起来不错,我正在做类似的事情,尽管我是从活动中添加我的初始片段,add而不是通过在布局中引用它来加载它。那里可能有一个错误。仅供参考,我正在使用兼容性库。

可能值得尝试:

1)将事务添加到返回堆栈中,看看这是否会产生影响,看来您无论如何都可能需要该功能。

2) 为布局中的片段指定一个 id 或标签,然后使用它来执行 aremoveaddfragB。

3)尝试从代码加载fragA,看看是否有区别。