在单个活动中交换片段?

时间:2011-06-15 16:22:02

标签: android layout android-fragments

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

<RelativeLayout>
  <fragment id="container" name="fragA"/>
  <ImageButton onClick="swapFragments" />
</RelativeLayout>

在活动的swapFragments(View)方法中,我尝试使用FragmentManagerfragA替换为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();
 }

4 个答案:

答案 0 :(得分:3)

不要混合使用XML和代码创建的碎片 - 会发生不好的事情。在布局中保留容器视图,然后在其中添加/替换片段(其中没有第一个片段)。

答案 1 :(得分:0)

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

可能值得尝试:

1)将事务添加到后台堆栈以查看是否会产生影响,看起来您可能仍然需要该功能。

2)在布局中为您的片段添加ID或标记,然后使用它来代替执行removeadd 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();
        }