Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 碎片没有被替换,而是放在上一个碎片的上面_Android_Android Fragments - Fatal编程技术网

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
    以编程方式添加片段

  • 第一个参数应为包含片段的容器的id,而不是片段的id。因此,应该将第一个参数作为添加第一个片段的容器的id传递


  • 有关更多详细信息,请参阅

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