片段替换显示两个片段

Posted

技术标签:

【中文标题】片段替换显示两个片段【英文标题】:Fragment replacement shows the two fragments 【发布时间】:2019-07-31 12:43:43 【问题描述】:

我尝试替换主布局中的片段。

在我的主要布局中:

<fragment
        android:id="@+id/frame_informations"
        android:name="GridFragment"
        android:layout_
        android:layout_
        android:layout_marginStart="2dp"
        android:layout_marginEnd="2dp"
        app:layout_constraintBottom_toTopOf="@+id/main_bottom_menu"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/llLit"/>

当我想替换这个片段时,我使用:

 public void switchFrameInformations(Fragment newFragment) 
            try 

                FragmentTransaction ft = fm.beginTransaction();
               // ft.setCustomAnimations(android.R.anim., android.R.anim.fade_out);
                if (fm.findFragmentById(R.id.frame_informations) == null) 
                    ft.add(R.id.frame_informations, newFragment);
                 else 
                    ft.replace(R.id.frame_informations, newFragment);
                
              //  ft.addToBackStack(null);
                ft.commit();
                fm.findFragmentById(R.id.frame_informations).getView().requestLayout();
             catch (Exception e) 
                e.printStackTrace();
            
        

fm 是片段管理器...

这可行,但发生了一些奇怪的事情:新片段包含名称列表,并且背景是透明的。替换结束时,我可以在新片段的背景中看到旧片段...

在调试控制台中,我可以看到所有方法通常都被调用:onDestroy 等...对于旧片段。我猜测 XML 描述中的名称可能会导致问题:

android:name="GridFragment"

但是如果没有名字就无法编译...

就我认为这是一个常见问题而言,我试图在网上找到解决方案,但我找不到任何解决方案。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

&lt;fragment 替换为&lt;FrameLayoutonCreate你的activity中添加如下代码

if (savedInstanceState == null) 
    fm.beginTransaction()
        .replace(R.id.frame_informations, GridFragment())
        .commit();

这将正确初始化您的片段,并允许您在代码中轻松切换片段。

【讨论】:

以上是关于片段替换显示两个片段的主要内容,如果未能解决你的问题,请参考以下文章

如何从主要活动中替换片段

Android片段重叠

使用 replace() 时片段未替换

显示/隐藏片段而不是替换

替换两个不同的片段后,按下后​​退按钮时会重新创建第一个片段

在片段替换上显示/隐藏 Android 软键盘