如何从一个新的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)可见..

任何想法我在这里做错了什么?

+0

你想替换以前的片段,或者你想只是打开旧的片段? –

+0

我想在viewpager(HomeScreenFragment)内部有2个片段,可以用几种不同的可能片段替换它们,这取决于RecyclerView项目单击的类型和总是作为viewpager中第二个片段的一个片段 – user8789149

+0

如果我正确理解,您需要分离每个页面的片段堆栈?就像你点击page1列表项1并在page1上出现新的片段上面的列表? –

您使用的容器是错误的。在活动xml中保留一个容器并使用该容器来加载所有片段。

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

这里的容器是应该存在viewpager和其他视图的活动容器。

+0

但是, case我会用新的片段替换整个viewpager,对吧?我想在viewpager中有两个片段,只有第一个片段可以根据其内部点击的项目类型进行替换...例如,当应用程序运行时,我在viewpager中有一个HomeScreenFragment和SecondFragment。当我点击HomeScreenFragment中的其中一个项目后,它应该被MainTypesFragment替换,但SecondFragment应该是未触及的。是否有可能实现? – user8789149

+0

然后你必须保持一个frameLayout的XML空间内匹配HomeScreenFragment视图,然后你有替换..如果你添加代码,我可以说清楚。 – Anonymous

+0

其实更好的解决方案将是你如何建议。所以我有一个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> 

它的工作对我来说,我希望这将有助于您的问题!

+0

您能否提供一些关于您使用的结构和ID的信息?您当前的根布局的“mainContentStore”ID还是帧布局viewpager在? – user8789149

+0

但是您要更换的片段不在ViewPager内部,对吧?你只是用一个新的规则替换一个普通的片段? – user8789149

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

如果要打开新的片断,你应该用户像这样 在页面片段

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

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

+0

它可以工作,但HomeScreenFragment(ViewPager中的HomeScreenFragment)在新版本中保持可见... – user8789149

+0

为New Fragment和'android:clickable =“true”'为根布局添加背景。如果你有机会回到前一个片段。 –