如何从一个新的ViewPager中替换片段
我发现了很多类似的问题和很多不同的答案,但是他们都没有帮助我。如果可能的话,我会尽量发表一个明确的问题以获得明确的答案。如何从一个新的ViewPager中替换片段
所以我有一个活动,其中包含(现在)只有一个片段(HomeScreenFragment)的FragmentStatePagerAdapter的ViewPager。
Inside HomeScreenFragment我有一个RecyclerView列表的几种不同的图标,应该打开每个项目点击不同的片段。
HomeScreenFragment具有一个FrameLayout作为ID为“container”的根布局。这是我打电话在这种情况下,与MainTypesFragment更换HomeScreenFragment方法:
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)可见..
任何想法我在这里做错了什么?
您使用的容器是错误的。在活动xml中保留一个容器并使用该容器来加载所有片段。
transaction.replace(R.id.container, fragment);
这里的容器是应该存在viewpager和其他视图的活动容器。
但是, case我会用新的片段替换整个viewpager,对吧?我想在viewpager中有两个片段,只有第一个片段可以根据其内部点击的项目类型进行替换...例如,当应用程序运行时,我在viewpager中有一个HomeScreenFragment和SecondFragment。当我点击HomeScreenFragment中的其中一个项目后,它应该被MainTypesFragment替换,但SecondFragment应该是未触及的。是否有可能实现? – user8789149
然后你必须保持一个frameLayout的XML空间内匹配HomeScreenFragment视图,然后你有替换..如果你添加代码,我可以说清楚。 – Anonymous
其实更好的解决方案将是你如何建议。所以我有一个FrameLayout里面有一个ID为fragment_container的ViewPager。当我调用replace方法时,我把这个id作为第一个参数,但是它不能很好地代替它..我可以看到新的片段,但是前一个,主要的仍然可以在新的片段(ViewPager中的)下看到。 .. – user8789149
你可以试试我的代码:
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>
它的工作对我来说,我希望这将有助于您的问题!
您能否提供一些关于您使用的结构和ID的信息?您当前的根布局的“mainContentStore”ID还是帧布局viewpager在? – user8789149
但是您要更换的片段不在ViewPager内部,对吧?你只是用一个新的规则替换一个普通的片段? – user8789149
您需要容器内部活动ViewPager
和内部片段(页面),用于在页面内打开新片段的容器。
如果要打开新的片断,你应该用户像这样 在页面片段
getChildFragmentManager().beginTransaction()
.replace(R.id.page_fragment_container, fragment)
.addToBackStack(name)
.commit()
其中页面片段内R.id.page_fragment_container
容器。
它可以工作,但HomeScreenFragment(ViewPager中的HomeScreenFragment)在新版本中保持可见... – user8789149
为New Fragment和'android:clickable =“true”'为根布局添加背景。如果你有机会回到前一个片段。 –
你想替换以前的片段,或者你想只是打开旧的片段? –
我想在viewpager(HomeScreenFragment)内部有2个片段,可以用几种不同的可能片段替换它们,这取决于RecyclerView项目单击的类型和总是作为viewpager中第二个片段的一个片段 – user8789149
如果我正确理解,您需要分离每个页面的片段堆栈?就像你点击page1列表项1并在page1上出现新的片段上面的列表? –