如何用新片段替换 ViewPager 中的片段

How to replace fragment from ViewPager with a new one

我发现了很多类似的问题和很多不同的答案,但其中 none 对我有所帮助。如果可能的话,我会尝试 post 一个明确的问题以获得明确的答案。

所以我有一个 Activity,它有一个带有 FragmentStatePagerAdapter 的 ViewPager(目前)只包含一个片段 (HomeScreenFragment)。

在 HomeScreenFragment 中,我有一个 RecyclerView,其中列出了几种不同的图标,每次单击时应打开不同的片段。

HomeScreenFragment 有一个 FrameLayout 作为根布局,id 名称为 "container"。在这种情况下,这是我调用以将 HomeScreenFragment 替换为 MainTypesFragment 的方法:

 private void openAllTypesFragment() {
    MainTypesFragment fragment = new MainTypesFragment();
    FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.container, fragment);
    transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    transaction.addToBackStack(HomeScreenFragment.class.getName());
    transaction.commit();
    eventBus.post(new Event(null, Event.EVENT_FRAGMENT));
}

由于 FragmentStatePagerAdapter 在 MainActivity 中初始化,我正在发送一个事件,MainActivity 将捕获并调用 adapter.notifyDataSetChanged();

这样做,没有任何反应。我尝试使用 getChildFragmentManager() 而不是 getActivity().getSupportFragmentManager() 在这种情况下,之前的片段 (HomeScreenFragment) 在新片段 ( MainTypesFragment)..

知道我在这里做错了什么吗?

您正在使用的容器是 wrong.Maintain activity xml 中的一个容器,并使用该容器加载所有片段。

transaction.replace(R.id.container, fragment);

此处的容器是 activity 容器,其中应存在 viewpager 和其他视图。

你可以试试我的代码:

    private void addFilmDetailFragment(Movie movie){
        android.support.v4.app.FragmentManager fragmentManager = getFragmentManager();
        android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        FilmDetailFragment fragment = new FilmDetailFragment();

        Bundle bundle = new Bundle();
        bundle.putParcelable("movie", movie);  // Key, value
        fragment.setArguments(bundle);

        fragmentTransaction.replace(R.id.mainContentStore, fragment);
//        fragmentTransaction.replace(R.id.mainContent, fragment, Config.TAG_FILM_DETAIL);
        fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }

在 viewpager 的片段中:

<?xml version="1.0" encoding="utf-8"?> 

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainContentStore"
    android:layout_width="match_parent"
    android:layout_gravity="center"

    android:layout_height="match_parent">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerFilm"
        android:layout_gravity="center"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />


</FrameLayout>

对我有用,希望对你的问题有所帮助!

您需要 activity 内的容器用于 ViewPager 和内部片段(页面),用于在页面内打开新片段的容器。

如果你想打开新的片段,你应该使用这样的东西 在页面片段中

getChildFragmentManager().beginTransaction()
      .replace(R.id.page_fragment_container, fragment)
      .addToBackStack(name)
      .commit()

其中 R.id.page_fragment_container 页面片段内的容器。