在单个活动中交换片段?

6

在平板电脑上,我们有两个片段(同一数据的两个不同视图)并排放置。在移动设备上,我们希望通过按钮轻松切换这两个片段。移动版面大致如下:

<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();

...但我总是可以透过fragB的透明部分看到fragA,这让我相信它只是将fragB放在fragA的上面,而不是替换它。

我开始使用事务中的hide(Fragment)和类似方法,但那看起来不是正确的做法。

有没有关于如何正确交换这些片段的提示?

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

 if(TABLET) {
   addFragmentA();
   addFragmentB();
 } else {
   addFragmentA();
 }

你找到这个问题的解决方案了吗? - Vihaan Verma
4个回答

3

不要混合使用在XML和代码中创建的Fragment - 会出现问题。在布局中保留一个容器视图,然后将Fragment添加/替换到其中(不要将第一个Fragment放在其中)。


0
首先,您可以尝试使用newInstance()工厂方法实例化片段B,而不是只使用new FragB()。 然而,我认为这不是问题所在。
您能否尝试不在XML布局中使用片段标记? 只需像这样做:
<RelativeLayout>
  <Linear/FrameLayout id="container" name="fragA"/>
  <ImageButton onClick="swapFragments" />
</RelativeLayout>

因此,使用Frame或LinearLayout作为片段的容器,并在片段的onCreateView回调中进行充气。也许这会有所帮助,请告诉我。

干杯!


0
从我看到的情况来看,你没有隐藏/分离之前的片段,所以两个都会显示出来。你可以实现类似这样的功能:
        if (mFragment != null) { 
            ft = mActivity.getSupportFragmentManager().beginTransaction();  
            ft.hide(mFragment);                 
            ft.detach(mFragment);
            ft.commitAllowingStateLoss();
        }

0

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

也许值得尝试:

1)将事务添加到后退堆栈中,看看是否有所不同,似乎您可能需要该功能。

2)为布局中的片段分配一个ID或标记,然后使用它执行removeadd fragB。

3)尝试从代码中加载fragA,看看是否有所不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接