1

我發現了很多類似的問題和很多不同的答案,但是他們都沒有幫助我。如果可能的話,我會盡量發表一個明確的問題以獲得明確的答案。如何從一個新的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上出現新的片段上面的列表? –

回答

0

您使用的容器是錯誤的。在活動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

0

你可以試試我的代碼:

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

0

您需要容器內部活動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」'爲根佈局添加背景。如果你有機會回到前一個片段。 –