Android 碎片没有被替换,而是放在上一个碎片的上面
活动:Android 碎片没有被替换,而是放在上一个碎片的上面,android,android-fragments,Android,Android Fragments,活动: FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); Fragment1 fragment = new Fragment1(); Fragment2 fragment2 = new Fragment2(); transaction.replace(R.id.Fragment1, fragment); transaction.addToBackStack(null); tran
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Fragment1 fragment = new Fragment1();
Fragment2 fragment2 = new Fragment2();
transaction.replace(R.id.Fragment1, fragment);
transaction.addToBackStack(null);
transaction.commit();
FragmentTransaction transaction2 = getSupportFragmentManager().beginTransaction();
transaction2.replace(R.id.Fragment1, fragment2);
transaction2.addToBackStack(null);
transaction2.commit();
视图中的代码:
<fragment
android:id="@+id/Fragment1"
android:name="com.landa.fragment.Fragment1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_below="@+id/include1" />
问题是,内容并没有真正被替换——它被放在最上面(因此重叠)
当我单击“上一步”时,第一个片段正确显示(没有第二个片段),但最初两个片段都可见(我只希望最后一个片段可见)
我在这里遗漏了什么?您可以在替换碎片之前清除Backbackback:
FragmentManager fm = getActivity().getSupportFragmentManager();
for (int i = 0; i < fm.getBackStackEntryCount(); i++) {
fm.popBackStack();
}
// replace your fragments
FragmentManager fm=getActivity().getSupportFragmentManager();
对于(int i=0;i
您在这里做错了两件事:
xml
布局文件中的片段。您应该在布局中创建一个容器(例如FrameLayout
),然后使用FragmentTransaction
以编程方式添加片段有关更多详细信息,请参阅 android开发者网站建议使用
FrameLayout
在运行时动态加载片段。您已经在xml文件中硬编码了片段。因此,无法在运行时将其删除,如本链接中所述:
此链接显示如何通过程序添加片段:
我有一个类似的问题,但我的问题是我使用了两个不同的片段管理器:
一个来自
getSupportFragmentManager()
,另一个来自getFragmentManager()
。如果我用SupportFragmentManager
添加了一个片段,然后尝试用FragmentManager
替换该片段,该片段就会添加到顶部。我需要更改代码,以便使用相同的FragmentManager
,解决问题。我同意萨潘·迪瓦卡尔的回答。但我已经找到了一个解决方法,可以解决这个问题
首先,在活动(例如,activity\u main
)中,在拥有所有布局的位置添加一个FrameLayout
。它的高度和宽度应与父级匹配
。另外,给它一个id
现在,在要替换当前布局的片段中,调用onPause()
和onResume()
。初始化视图中的所有内部容器。并在onResume()
中将其可见性设置为已消失,在onPause()中将其可见性设置为
注意:不是要用此片段替换的框架布局
假设您在activity\u main.xml
中有ViewPager
、TabLayout
、ImageView
和一个自定义的
。如上所述,添加一个FrameLayout
在abcfargment.java
中的onClick()
函数中,在事务中添加addToBackstack(null)
示例代码:
fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_frame_layout,new ShopFragment());
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
在xyzFragment中,它将取代abcffragment(以及activity_main.xml中显示的所有内容),执行以下操作
快乐编码 感谢萨潘·迪瓦卡和其他人。这个答案帮助了我。我只是创建了一个RelativeLayout,其中没有片段,将RelativeLayout用作父视图或组视图,在要替换的事务中指定了该组视图,它就工作了
代码:
XML:
使用容器而不是片段
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="Hello World!" />
请注意,您的fragment类应该导入“android.app.fragment”
请确保使用“support.v4”或“原始”实现,并且不要混合使用它们。我遇到这个问题是因为我混合了它们。您可以使用来自FragmentTransaction的setTransition方法来修复重叠问题
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
我有同样的问题,看到了所有的答案,但没有一个包含我的错误!
在尝试替换当前片段之前,我在容器活动的xml中显示了默认片段,如下所示:
<FrameLayout
android:id="@+id/fragment_frame_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="....ShopFragment"
android:id="@+id/fragment"
tools:layout="@layout/fragment_shop" />
</FrameLayout>
以及容器活动xml:
<FrameLayout
android:id="@+id/fragment_frame_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
在Oncreate()中
现在,这将始终是您的默认片段…如果您在xml布局中添加片段,它将始终重叠,因此在运行时使用片段设置初始内容使用此问题解决后,我遇到了相同的问题
以框架布局为例,其中u替换u片段
<FrameLayout
android:id="@+id/fragment_place"
android:layout_width="match_parent"
android:layout_height="match_parent" />
如果你想要完整的例子,我会发送给你只是评论我 我也有同样的问题,但这是因为我没有改变我试图添加到framelayout中的片段的背景色
尝试这样做,将layout\u height
和layout\u width
设置为match\u parent
我曾经遇到过这个问题,发现这是因为我意外删除了xml代码中缺少的android:background
属性。我相信它的工作原理就像你在画墙时,android:background
是墙的颜色,而其他视图则放在基础颜色之上。如果在定位视图之前不绘制墙,则视图将位于该墙中已存在的部分的顶部,在您的情况下,是另一个片段。我不知道这是否对你有帮助,祝你好运。我已经尝试了所有的案例,试图解决问题,但仍然没有找到解决方案。我不知道为什么它不适合我。我同意上面的答案,因为很多人都同意
我只是扩展了答案,下面是我的工作方式。
我在fragment.xml
文件的顶部父布局中添加了这个属性android:clickable=“true”
<FrameLayout
android:id="@+id/fragment_frame_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="....ShopFragment"
android:id="@+id/fragment"
tools:layout="@layout/fragment_shop" />
</FrameLayout>
fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_frame_layout,new ShopFragment());
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
<FrameLayout
android:id="@+id/fragment_frame_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
BaseFragmentloginpage fragment = new BaseFragmentloginpage();
android.support.v4.app.FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.frame, fragment);
fragmentTransaction.isAddToBackStackAllowed();
fragmentTransaction.commit();
<FrameLayout
android:id="@+id/fragment_place"
android:layout_width="match_parent"
android:layout_height="match_parent" />
public void selectFrag(View view) {
Fragment fr;
if(view == findViewById(R.id.button2))
{
fr = new FragmentTwo();
}else {
fr = new FragmentOne();
}
FragmentManager fm = getFragmentManager();
FragmentTransaction fragmentTransaction = fm.beginTransaction();
fragmentTransaction.replace(R.id.fragment_place, fr);
fragmentTransaction.commit();
<FrameLayout
android:id="@+id/fragment_frame_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?android:windowBackground">
//Add fragment here
</FrameLayout>
fragmentTransactionChange = MainActivity.this.getSupportFragmentManager().beginTransaction();
fragmentTransactionChange.replace(R.id.progileframe, changeFragment);
fragmentTransactionChange.addToBackStack(null);
fragmentTransactionChange.commit();