如何用新片段替换 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
页面片段内的容器。
我发现了很多类似的问题和很多不同的答案,但其中 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
页面片段内的容器。