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和代码中创建的片段混用,否则会发生不好的事情。在布局中保留一个容器视图,然后向其中添加/替换片段(不要在其中包含第一个片段)。您找到解决此问题的方法了吗?