Android 在单个活动中交换片段?

Android 在单个活动中交换片段?,android,layout,android-fragments,Android,Layout,Android Fragments,在平板电脑上,我们有两个相邻的片段(相同数据的两个不同视图)。在移动设备上,只需按下一个按钮,我们就可以在这两个片段之间切换。移动布局如下所示: <RelativeLayout> <fragment id="container" name="fragA"/> <ImageButton onClick="swapFragments" /> </RelativeLayout> <RelativeLayout> <Line

在平板电脑上,我们有两个相邻的片段(相同数据的两个不同视图)。在移动设备上,只需按下一个按钮,我们就可以在这两个片段之间切换。移动布局如下所示:

<RelativeLayout>
  <fragment id="container" name="fragA"/>
  <ImageButton onClick="swapFragments" />
</RelativeLayout>
<RelativeLayout>
  <Linear/FrameLayout id="container" name="fragA"/>
  <ImageButton onClick="swapFragments" />
</RelativeLayout>
…但我总能通过
fragB
的透明部分看到
fragA
,这让我相信它只是将
fragB
放在
fragA
之上,而不是取代它

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

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

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


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

也许值得一试:

1) 将事务添加到后堆栈中,看看这是否会有所不同,看起来您可能仍然需要该功能

2) 为布局中的片段指定一个id或标记,然后使用该id或标记执行
remove
add
fragB


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

首先,您可以尝试使用newInstance()工厂方法来实例化片段B,而不仅仅是新的FragB()。 然而,我认为这不是问题所在

您可以试着在XML布局中不使用片段标记吗? 就这样做吧:

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

因此,使用框架或线性布局作为片段的容器,并在片段的onCreateView回调中将其充气。也许有帮助,让我知道


干杯

据我所知,您没有隐藏/分离上一个片段,因此这两个片段都将显示出来。您可以实现如下内容:

        if (mFragment != null) { 
            ft = mActivity.getSupportFragmentManager().beginTransaction();  
            ft.hide(mFragment);                 
            ft.detach(mFragment);
            ft.commitAllowingStateLoss();
        }

不要将XML和代码中创建的片段混用,否则会发生不好的事情。在布局中保留一个容器视图,然后向其中添加/替换片段(不要在其中包含第一个片段)。

您找到解决此问题的方法了吗?