8

我想創建一個包含5個片段的ViewPager。 「容器」的片段,因此每個片段都包含2個片段。 4個第一個片段具有相同的佈局,屬於同一個類。第五個來自另一個班級,這個班級沒有問題。ViewPager與同一類的多個片段實例

問題是,當活動啓動時,只有1個片段似乎正在工作(位於viewPager中位置0的一個片段)。我試圖在我的PagerAdapter中的位置0處返回新的Fragment(),但是當我這樣做時,它是正在工作的第二個片段。 (通過工作我的意思是在左邊顯示的列表中,我仍然沒有照顧的細節片段的右側)

下面是一些代碼

CustomPagerAdapter.java

public class CustomPagerAdapter extends FragmentPagerAdapter{ 

public CustomPagerAdapter(FragmentManager fm) { 
    super(fm); 
} 
public CustomPagerAdapter(FragmentManager fm, Context context) { 
    super(fm); 

} 

@Override 
public Fragment getItem(int pos) { 

    if(pos == 4) 
     return new OtherContainerFragment(); 
    else 
     return new ContainerFragment(pos); 

} 

@Override 
public int getCount() { 

    return 5; 
} 

ContainerFragment的.java

public class ContainerFragment extends Fragment { 
private int CONTAINER_TYPE; 

public ContainerFragment(){ 

} 

public ContainerFragment(int type){ 
    CONTAINER_TYPE = type; 
} 



@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.fragment_container, container, false); 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 


    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); 
    CustomListFragment frag = new CustomListFragment(CONTAINER_TYPE); 

    ft.replace(R.id.replaceable_list, frag); 

    ft.commit(); 

CustomListFragment.java

public class CustomListFragment extends SuperCustomListFragment{ 

private ArrayList<Model> mModels; 
private int TYPE; 


public CustomListFragment(){ 

} 

public CustomListFragment(int type){ 
    TYPE = type; 
} 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return super.onCreateView(inflater, container, savedInstanceState); 
} 


@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    mModels = new ArrayList<Model>(); 


    if(TYPE == AppConstants.FRAGMENT_TYPE_JOURNAL){ 
     mAdapter = AppUtils.getJournalListAdapter(getActivity(), mModels); 
     new syncPapers().execute(); 
    }else if(TYPE == AppConstants.FRAGMENT_TYPE_MOVIES){ 
     mAdapter = AppUtils.getMoviesListAdapter(getActivity(), mModels); 
     new syncMovies().execute(); 
    } 


    if(mAdapter != null) 
     mListView.setAdapter(mAdapter); //mListView is defined in the superClass 

下面是我使用的常量:

public class AppConstants { 


public static final int FRAGMENT_TYPE_AGENDA = 0; //so Fragment at position 0 should be of type agenda 
public static final int FRAGMENT_TYPE_NEWS = 1; // position 1 should be of type news 
public static final int FRAGMENT_TYPE_MOVIES = 2; // ... 
public static final int FRAGMENT_TYPE_JOURNAL = 3; // ... 

} 

而對容器中的XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="horizontal" > 

<LinearLayout 
    android:id="@+id/replaceable_list" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 
</LinearLayout> 

<LinearLayout 
    android:id="@+id/replaceable_details" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_weight="1" 
    android:background="@drawable/background" > 
</LinearLayout> 

</LinearLayout> 

所以這段代碼是不工作,似乎在片段左側的列表容器在每個片段中被替換,並且只有位置0處的片段顯示它。 (目前它顯示類型爲「JOURNAL」的適配器的列表,但它應該顯示類型「AGENDA」的列表

------------------- - * 但是... * --------------------

如果我創建不同fragment_container佈局文件,並寫! IF條件在ContainerFragment.java中的onCreateView和onViewCreated中,一切正常。 So:

ContainerFragme nt.java

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle  savedInstanceState) { 
if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_JOURNAL) 
    return inflater.inflate(R.layout.fragment_container_journal, container, false); 
else if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_MOVIES) 
    return inflater.inflater(R.layout.fragment_container_movies, container, false); 
else 
    return super.onCreateView(LayoutInflater inflater, ViewGroup container, Bundle  savedInstanceState); 
} 


@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 


    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction(); 
    CustomListFragment frag = new CustomListFragment(CONTAINER_TYPE); 

    if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_JOURNAL) 
     ft.replace(R.id.replaceable_journal_list, frag); 
    else if(CONTAINER_TYPE == AppConstants.FRAGMENT_TYPE_MOVIES) 
     ft.replace(R.id.replaceable_movies_list, frag); 
    else 
     return; 

    ft.commit(); 

我想這是因爲在每一個片段,我更換相同ID的LinearLayout中? (replaceable_list) 我認爲有可能爲每個片段共享相同的佈局文件,並且不想創建4個相同的佈局文件。但看起來我必須這樣做? 或我在這裏錯過了什麼?

謝謝您的時間,

+0

你沒有正確地傳遞位置,你的片段,看到大多數upvoted的:http://stackoverflow.com/questions/9245408/best-practice-for-instantiating-a-new-android-fragment – cYrixmorten

+0

是的,我有在發佈我的問題之前已經嘗試過,但它也不起作用。我認爲這與使用相同的佈局有關,但我想確定它。 – Seb83

+0

好吧,它確實看起來有點腥,我與嵌套片段。據我瞭解,你應該直接在你的CustomPagerAdapter的getItem中進行切換,返回你想要顯示的片段(而不是在兩者之間進行大量的替換)。有效地跳過容器分割。 – cYrixmorten

回答

7

我能夠通過設置在每個片段的位置內膨脹的佈局id來解決這個問題。

什麼,你必須做的就是簡單地ContainerFragment類改變方法onCreateView中,您可以:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment_container, container, false); 
    v.setId(CONTAINER_TYPE) 
    return v; 

這工作,因爲FragmentPagerAdapter實現處理片段標籤的方式。

13

雖然很晚的反應,但我面臨同類問題的,我用

getChildFragmentManager().beginTransaction() 

,而不是

getActivity().getSupportFragmentManager().beginTransaction() 

由於在這種情況下,我們正試圖使交易固定的問題從一個片段(附加到ViewPager的片段列表中的一個,因此持有ViewPager的Activity),所以我們必須在這裏使用getChildFragmentManager()來獲得所需的結果。

相關問題