30

我有一个选项卡 +ViewPager布局,在其中一个选项卡中我有一个列表视图。当我在 onclick 上替换该列表片段时,我仍然可以在新片段下看到旧片段。看:

在此处输入图像描述

代码:

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
HallsInStateFragment hallsForState = new HallsInStateFragment();        
transaction.replace(R.id.container, hallsForState);
transaction.addToBackStack(null);
transaction.commit();

其中R.id.container是视图中的 FrameLayout。

4

8 回答 8

12

当需要从父视图中删除所有视图时,您需要在片段的onCreateView()方法中的容器中调用removeAllViews() 。

这是代码:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

container.removeAllViews(); // Inflate the layout for this fragment
 return inflater.inflate(R.layout.fragment_example, container, false); 
}
于 2017-02-08T12:47:35.273 回答
8

而不是 R.id.container 像这样放置片段的 id: ((ViewGroup)getView().getParent()).getId()。实际上它不是替换片段而是替换之前的布局,即 FrameLayout。它对我有用,我希望它也适用于你的情况。

于 2013-06-18T11:25:12.317 回答
5

将此添加到两个片段父布局

android:background="@android:color/white".

您正在替换的一个和您将替换的一个。

于 2019-09-26T07:10:18.480 回答
2

片段的 UI 是活动视图层次结构的一部分。因此,如果您在 onCreateView() 方法中创建了视图,那么您可以使用 ViewGroup 容器扩展您的布局。此容器保留对您的片段视图的引用。尝试覆盖片段的 onDestroyView() 方法并从父级中删除所有视图:

@Override
public void onDestroyView() {
    //mContainer.removeAllViews();
    ViewGroup mContainer = (ViewGroup) getActivity().findViewById(R.id.container);
    mContainer.removeAllViews();
    super.onDestroyView();
}
于 2014-11-03T21:36:34.297 回答
1

你的片段应该FrameLayout像这样加载

    <FrameLayout
    android:id="@+id/frameLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?android:windowBackground" />

并且您的片段应该frameLayout通过此功能添加/加载

    private fun switchFragment(
    fragment: Fragment,
    addToBackstack: Boolean
) {
    //check new fragment is alredy loaded currently, then return
    val myFragment =
        supportFragmentManager.fragments.lastOrNull()//return current visible fragment or null
    if (myFragment != null && fragment::class == myFragment::class) {
        return
    }

    val fragmentManager = supportFragmentManager
    val transaction = fragmentManager.beginTransaction()
    //transaction.add(R.id.frameLayout, fragment, fragment.javaClass.name)
    transaction.replace(
        R.id.frameLayout,
        fragment,
        fragment.javaClass.name
    )//using replace will make sure that the previous fragment won't be visible from new fragment
    if (addToBackstack) {
        transaction.addToBackStack(fragment.javaClass.name)
    }
    transaction.commit()
}

所以最初,你的第一个片段应该像这样加载,

switchFragment(HomeFragment(), false)

然后从底部导航视图或导航抽屉中选择其他片段,像这样调用这个函数

switchFragment(MyProfileFragment(), true)
于 2020-09-01T07:16:51.900 回答
0

在根视图中添加clickable = true并添加替换当前片段的片段的背景颜色(都在 xml 中)。它只是解决方法的修复

于 2016-02-16T18:40:38.700 回答
0

最好的代码。显然,没有使用另一台设备。在您的 Activity onCreate 或添加片段之前添加以下代码:

for (Fragment fragment : getSupportFragmentManager().getFragments()) {
    if (fragment instanceof NavigationDrawerFragment) {
        continue;
    }
    else if (fragment != null) {
        getSupportFragmentManager().beginTransaction().remove(fragment).commit();
    }
}

快乐编码:)

于 2020-12-06T21:40:07.567 回答
0

在我的案例中,这是因为我使用静态片段作为

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

<fragment
    android:name="com.example.android.FooFragment"
    android:id="@+id/fooFragment"
    android:layout_width="match_parent" 
    android:layout_height="match_parent" />

</LinearLayout>

其中 foofragment 是初始片段,然后尝试用其他片段替换片段,以便两个片段重叠。

相反,问题解决了,当我使用动态链接时,代替 xml 中的片段,我们需要使用 framelayout 作为

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

  <FrameLayout
       android:id="@+id/your_placeholder"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
  </FrameLayout>

</LinearLayout>

然后动态添加 fragment-1 并替换为 fragment-2 ,对我来说工作正常。

I did not find answer earlier, hence posting this solution.
于 2022-02-07T14:00:45.507 回答